Author: remm
Date: Mon Nov  2 16:46:59 2015
New Revision: 1712081

URL: http://svn.apache.org/viewvc?rev=1712081&view=rev
Log:
- 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).
- Also add a missing i18n.
- Adapt patch from trunk to the 8 connectors.

Modified:
    tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
    
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
    
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
    tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java
    tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java
    tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java 
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java 
Mon Nov  2 16:46:59 2015
@@ -241,7 +241,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;
@@ -286,7 +286,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"));
         }
         // Need to check is finished before we check available() as BIO always
         // returns 1 for isAvailable()

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties 
(original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/connector/LocalStrings.properties 
Mon Nov  2 16:46:59 2015
@@ -68,6 +68,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/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java 
(original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java 
Mon Nov  2 16:46:59 2015
@@ -873,7 +873,7 @@ public abstract class AbstractHttp11Proc
             break;
         }
         case AVAILABLE: {
-            request.setAvailable(inputBuffer.available());
+            request.setAvailable(inputBuffer.available(param == Boolean.TRUE));
             break;
         }
         case NB_WRITE_INTEREST: {

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java 
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/AbstractInputBuffer.java 
Mon Nov  2 16:46:59 2015
@@ -326,14 +326,14 @@ public abstract class AbstractInputBuffe
      * Available bytes in the buffers (note that due to encoding, this may not
      * correspond).
      */
-    public int available() {
+    public 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/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java 
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java 
Mon Nov  2 16:46:59 2015
@@ -76,7 +76,7 @@ public class InternalInputBuffer extends
      * tested for == 0 or &gt; 0.
      */
     @Override
-    public int available() {
+    public int available(boolean read) {
         return 1;
     }
 

Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1712081&r1=1712080&r2=1712081&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Mon Nov  2 16:46:59 2015
@@ -125,6 +125,11 @@
         Add a new RestCsrfPreventionFilter that provides basic CSRF protection
         for REST APIs. (violetagg)
       </add>
+      <fix>
+        <bug>57799</bug>: InputStream.available() was causing an IO operation
+        to occur even in blocking mode, which caused problems with NIO2.
+        (remm)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to