Author: remm Date: Fri Jun 27 15:52:03 2014 New Revision: 1606136 URL: http://svn.apache.org/r1606136 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56663 BZ56663: Improve available to also include buffered bytes in the Servlet layer, handle a case (thanks telnet) where the amount of remaining bytes could become negative (the input is still finished then of course), filter an extra write event with non blocking write IO if async completes after the first read.
Modified: tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java tomcat/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java tomcat/trunk/webapps/docs/changelog.xml 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=1606136&r1=1606135&r2=1606136&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java Fri Jun 27 15:52:03 2014 @@ -266,7 +266,17 @@ public class InputBuffer extends Reader public boolean isFinished() { - return coyoteRequest.isFinished(); + int available = 0; + if (state == BYTE_STATE) { + available = bb.getLength(); + } else if (state == CHAR_STATE) { + available = cb.getLength(); + } + if (available > 0) { + return false; + } else { + return coyoteRequest.isFinished(); + } } Modified: tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java?rev=1606136&r1=1606135&r2=1606136&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java (original) +++ tomcat/trunk/java/org/apache/coyote/AbstractProtocol.java Fri Jun 27 15:52:03 2014 @@ -651,6 +651,9 @@ public abstract class AbstractProtocol<S state = processor.event(status); } else if (processor.isUpgrade()) { state = processor.upgradeDispatch(status); + } else if (status == SocketStatus.OPEN_WRITE) { + // Extra write event likely after async, ignore + state = SocketState.LONG; } else { state = processor.process(wrapper); } Modified: tomcat/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java?rev=1606136&r1=1606135&r2=1606136&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java Fri Jun 27 15:52:03 2014 @@ -214,6 +214,6 @@ public class IdentityInputFilter impleme public boolean isFinished() { // Only finished if a content length is defined and there is no data // remaining - return contentLength > -1 && remaining == 0; + return contentLength > -1 && remaining <= 0; } } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1606136&r1=1606135&r2=1606136&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Fri Jun 27 15:52:03 2014 @@ -90,6 +90,15 @@ </fix> </changelog> </subsection> + <subsection name="Coyote"> + <changelog> + <fix> + <bug>56663</bug>: Fix edge cases demonstrated by ByteCounter relating + to data available, remaining and extra write events, mostly occurring + with non blocking Servlet 3.1. (remm) + </fix> + </changelog> + </subsection> <subsection name="Jasper"> <changelog> <fix> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org