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:08:43 UTC
svn commit: r1580083 - in /tomcat/tc7.0.x/trunk: ./
java/org/apache/catalina/core/AsyncContextImpl.java
java/org/apache/catalina/core/LocalStrings.properties
java/org/apache/coyote/AsyncContextCallback.java
java/org/apache/coyote/AsyncStateMachine.java
Author: markt
Date: Fri Mar 21 23:08:42 2014
New Revision: 1580083
URL: http://svn.apache.org/r1580083
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/tc7.0.x/trunk/ (props changed)
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties
tomcat/tc7.0.x/trunk/java/org/apache/coyote/AsyncContextCallback.java
tomcat/tc7.0.x/trunk/java/org/apache/coyote/AsyncStateMachine.java
Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
Merged /tomcat/trunk:r1580080
Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=1580083&r1=1580082&r2=1580083&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Fri Mar 21 23:08:42 2014
@@ -92,9 +92,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<AsyncListenerWrapper>();
listenersCopy.addAll(listeners);
@@ -132,6 +130,18 @@ public class AsyncContextImpl implements
Thread.currentThread().setContextClassLoader(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/tc7.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1580083&r1=1580082&r2=1580083&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/core/LocalStrings.properties Fri Mar 21 23:08:42 2014
@@ -72,6 +72,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.requestEnded=The request associated with the AsyncContext has already completed processing.
asyncContextImpl.noAsyncDispatcher=The dispatcher returned from the ServletContext does not support asynchronous dispatching
asyncContextImpl.dispatchingStarted=Asynchronous dispatch operation has already been called. Additional asynchronous dispatch operation within the same asynchronous cycle is not allowed.
Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/AsyncContextCallback.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/AsyncContextCallback.java?rev=1580083&r1=1580082&r2=1580083&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/coyote/AsyncContextCallback.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/AsyncContextCallback.java Fri Mar 21 23:08:42 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/tc7.0.x/trunk/java/org/apache/coyote/AsyncStateMachine.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/AsyncStateMachine.java?rev=1580083&r1=1580082&r2=1580083&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/coyote/AsyncStateMachine.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/AsyncStateMachine.java Fri Mar 21 23:08:42 2014
@@ -16,7 +16,6 @@
*/
package org.apache.coyote;
-import java.io.IOException;
import java.security.AccessController;
import java.security.PrivilegedAction;
@@ -188,21 +187,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) {
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org