You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/03/22 00:04:08 UTC
svn commit: r1580080 - in /tomcat/trunk: java/org/apache/catalina/core/
java/org/apache/coyote/ webapps/docs/
Author: markt
Date: Fri Mar 21 23:04:07 2014
New Revision: 1580080
URL: http://svn.apache.org/r1580080
Log:
Rework the fix for 56190 as the previous fix did not recycle the request in all cases leading to mis-routing of requests.
Modified:
tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
tomcat/trunk/java/org/apache/coyote/AsyncContextCallback.java
tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=1580080&r1=1580079&r2=1580080&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Fri Mar 21 23:04:07 2014
@@ -88,9 +88,7 @@ public class AsyncContextImpl implements
}
@Override
- public void fireOnComplete() throws IOException {
- // Before firing the event, close the response
- request.getResponse().finishResponse();
+ public void fireOnComplete() {
List<AsyncListenerWrapper> listenersCopy = new ArrayList<>();
listenersCopy.addAll(listeners);
@@ -108,6 +106,18 @@ public class AsyncContextImpl implements
} finally {
context.unbind(Globals.IS_SECURITY_ENABLED, oldCL);
}
+
+ // The application doesn't know it has to stop writing until it receives
+ // the complete event so the response has to be closed after firing the
+ // event.
+ try {
+ request.getResponse().finishResponse();
+ } catch (IOException ioe) {
+ // Catch this here and allow async context complete to continue
+ // normally so a dispatch takes place which ensures that the
+ // request and response objects are correctly recycled.
+ log.debug(sm.getString("asyncContextImpl.finishResponseError"), ioe);
+ }
}
public boolean timeout() {
Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1580080&r1=1580079&r2=1580080&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Fri Mar 21 23:04:07 2014
@@ -65,6 +65,7 @@ aprListener.tooLateForSSLRandomSeed=Cann
aprListener.tooLateForFIPSMode=Cannot setFIPSMode: SSL has already been initialized
aprListener.initializedOpenSSL=OpenSSL successfully initialized ({0})
+asyncContextImpl.finishResponseError=Response did not finish cleanly after AsyncContext completed
asyncContextImpl.request.ise=It is illegal to call getRequest() after complete() or any of the dispatch() methods has been called
asyncContextImpl.requestEnded=The request associated with the AsyncContext has already completed processing.
asyncContextImpl.response.ise=It is illegal to call getResponse() after complete() or any of the dispatch() methods has been called
Modified: tomcat/trunk/java/org/apache/coyote/AsyncContextCallback.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AsyncContextCallback.java?rev=1580080&r1=1580079&r2=1580080&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AsyncContextCallback.java (original)
+++ tomcat/trunk/java/org/apache/coyote/AsyncContextCallback.java Fri Mar 21 23:04:07 2014
@@ -16,8 +16,6 @@
*/
package org.apache.coyote;
-import java.io.IOException;
-
/**
* Provides a mechanism for the Coyote connectors to signal to a
* {@link javax.servlet.AsyncContext} implementation that an action, such as
@@ -26,5 +24,5 @@ import java.io.IOException;
* org.apache.coyote package.
*/
public interface AsyncContextCallback {
- public void fireOnComplete() throws IOException;
+ public void fireOnComplete();
}
Modified: tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java?rev=1580080&r1=1580079&r2=1580080&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java (original)
+++ tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java Fri Mar 21 23:04:07 2014
@@ -16,7 +16,6 @@
*/
package org.apache.coyote;
-import java.io.IOException;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -204,21 +203,11 @@ public class AsyncStateMachine<S> {
state = AsyncState.STARTED;
return SocketState.LONG;
} else if (state == AsyncState.MUST_COMPLETE) {
- try {
- asyncCtxt.fireOnComplete();
- } catch (IOException e) {
- // Socket is in unknown state. Close it.
- return SocketState.CLOSED;
- }
+ asyncCtxt.fireOnComplete();
state = AsyncState.DISPATCHED;
return SocketState.ASYNC_END;
} else if (state == AsyncState.COMPLETING) {
- try {
- asyncCtxt.fireOnComplete();
- } catch (IOException e) {
- // Socket is in unknown state. Close it.
- return SocketState.CLOSED;
- }
+ asyncCtxt.fireOnComplete();
state = AsyncState.DISPATCHED;
return SocketState.ASYNC_END;
} else if (state == AsyncState.MUST_DISPATCH) {
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1580080&r1=1580079&r2=1580080&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Mar 21 23:04:07 2014
@@ -45,6 +45,12 @@
issues to not "pop up" wrt. others).
-->
<section name="Tomcat 8.0.5 (markt)">
+ <subsection name="Catalina">
+ <changelog>
+ Rework the fix for <bug>56190</bug> as the previous fix did not recycle
+ the request in all cases leading to mis-routing of requests. (markt)
+ </changelog>
+ </subsection>
<subsection name="Coyote">
<changelog>
<fix>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org