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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org