Author: remm Date: Mon Nov 2 15:20:44 2015 New Revision: 1712044 URL: http://svn.apache.org/viewvc?rev=1712044&view=rev Log: - Tentative patch for the elusive 57799: some blocking IO code uses InputStream.available() (a useless call that has always been in the java.io API). Following the introduction of non blocking, available() now causes real IO to occur. While this should be mostly harmless for APR and NIO (which can "read" 0 bytes), it would leave an async read pending with NIO2. The read IO operation will now not occur unless a read listener has been set (in which case available() is mostly equivalent to the newer isReady() method). - Will wait until the fix is confirmed to work to port to 8, if not I will rework this.
Modified: tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Modified: tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1712044&r1=1712043&r2=1712044&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java Mon Nov 2 15:20:44 2015 @@ -224,7 +224,7 @@ public class InputBuffer extends Reader available = cb.getLength(); } if (available == 0) { - coyoteRequest.action(ActionCode.AVAILABLE, null); + coyoteRequest.action(ActionCode.AVAILABLE, Boolean.valueOf(coyoteRequest.getReadListener() != null)); available = (coyoteRequest.getAvailable() > 0) ? 1 : 0; } return available; @@ -269,7 +269,7 @@ public class InputBuffer extends Reader public boolean isReady() { if (coyoteRequest.getReadListener() == null) { - throw new IllegalStateException("not in non blocking mode."); + throw new IllegalStateException(sm.getString("inputBuffer.requiresNonBlocking")); } if (isFinished()) { // If this is a non-container thread, need to trigger a read Modified: tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1712044&r1=1712043&r2=1712044&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties Mon Nov 2 15:20:44 2015 @@ -64,6 +64,7 @@ coyoteResponse.sendRedirect.note=<html>< coyoteResponse.setBufferSize.ise=Cannot change buffer size after data has been written inputBuffer.streamClosed=Stream closed +inputBuffer.requiresNonBlocking=Not available in non blocking mode outputBuffer.writeNull=The String argument to write(String,int,int) may not be null Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java?rev=1712044&r1=1712043&r2=1712044&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java Mon Nov 2 15:20:44 2015 @@ -626,14 +626,14 @@ public class Http11InputBuffer implement * Available bytes in the buffers (note that due to encoding, this may not * correspond). */ - int available() { + int available(boolean read) { int available = lastValid - pos; if ((available == 0) && (lastActiveFilter >= 0)) { for (int i = 0; (available == 0) && (i <= lastActiveFilter); i++) { available = activeFilters[i].available(); } } - if (available > 0) { + if (available > 0 || !read) { return available; } Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1712044&r1=1712043&r2=1712044&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Mon Nov 2 15:20:44 2015 @@ -758,7 +758,7 @@ public class Http11Processor extends Abs break; } case AVAILABLE: { - request.setAvailable(inputBuffer.available()); + request.setAvailable(inputBuffer.available(param == Boolean.TRUE)); break; } case NB_WRITE_INTEREST: { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org