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: [email protected]
For additional commands, e-mail: [email protected]