Author: markt
Date: Wed Oct 29 21:01:06 2014
New Revision: 1635301

URL: http://svn.apache.org/r1635301
Log:
With the changes to the behaviour AsyncContext.isStarted() this method can no 
longer be used to determine if complete needs to be called to add a new method 
that can provide this information.

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java
    tomcat/trunk/java/org/apache/coyote/ActionCode.java
    tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java
    tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1635301&r1=1635300&r2=1635301&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Wed Oct 29 
21:01:06 2014
@@ -1634,6 +1634,16 @@ public class Request
         return result.get();
     }
 
+    public boolean canAsyncComplete() {
+        if (asyncContext == null) {
+            return false;
+        }
+
+        AtomicBoolean result = new AtomicBoolean(false);
+        coyoteRequest.action(ActionCode.ASYNC_CAN_COMPLETE, result);
+        return result.get();
+    }
+
     public boolean isAsync() {
         if (asyncContext == null) {
             return false;

Modified: tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java?rev=1635301&r1=1635300&r2=1635301&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/valves/ErrorReportValve.java Wed Oct 
29 21:01:06 2014
@@ -123,7 +123,7 @@ public class ErrorReportValve extends Va
             ExceptionUtils.handleThrowable(tt);
         }
 
-        if (request.isAsyncStarted()) {
+        if (request.canAsyncComplete()) {
             request.getAsyncContext().complete();
         }
     }

Modified: tomcat/trunk/java/org/apache/coyote/ActionCode.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ActionCode.java?rev=1635301&r1=1635300&r2=1635301&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/ActionCode.java (original)
+++ tomcat/trunk/java/org/apache/coyote/ActionCode.java Wed Oct 29 21:01:06 2014
@@ -158,6 +158,12 @@ public enum ActionCode {
     ASYNC_RUN,
 
     /**
+     * Call back to see if it is currently possible to call
+     * {@link javax.servlet.AsyncContext#complete()} without error.
+     */
+    ASYNC_CAN_COMPLETE,
+
+    /**
      * Callback for an async call to
      * {@link javax.servlet.AsyncContext#complete()}
      */

Modified: tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java?rev=1635301&r1=1635300&r2=1635301&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java [UTF-8] 
(original)
+++ tomcat/trunk/java/org/apache/coyote/AsyncStateMachine.java [UTF-8] Wed Oct 
29 21:01:06 2014
@@ -19,7 +19,6 @@ package org.apache.coyote;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
-import org.apache.catalina.Globals;
 import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState;
 import org.apache.tomcat.util.res.StringManager;
 import org.apache.tomcat.util.security.PrivilegedGetTccl;
@@ -107,38 +106,44 @@ public class AsyncStateMachine {
         StringManager.getManager(Constants.Package);
 
     private static enum AsyncState {
-        DISPATCHED(false, false, false),
-        STARTING(true, true, false),
-        STARTED(true, true, false),
-        MUST_COMPLETE(true, Globals.STRICT_SERVLET_COMPLIANCE, false),
-        COMPLETING(true, false, false),
-        TIMING_OUT(true, false, false),
-        MUST_DISPATCH(true, true, true),
-        DISPATCHING(true, false, true),
-        READ_WRITE_OP(true,true,false),
-        ERROR(true,false,false);
-
-        private boolean isAsync;
-        private boolean isStarted;
-        private boolean isDispatching;
+        DISPATCHED(false, false, false, false),
+        STARTING(true, true, true, false),
+        STARTED(true, true, true, false),
+        MUST_COMPLETE(true, true, false, false),
+        COMPLETING(true, false, false, false),
+        TIMING_OUT(true, false, false, false),
+        MUST_DISPATCH(true, true, false, true),
+        DISPATCHING(true, false, false, true),
+        READ_WRITE_OP(true, true, true, false),
+        ERROR(true, false, false, false);
+
+        private final boolean isAsync;
+        private final boolean isStarted;
+        private final boolean canComplete;
+        private final boolean isDispatching;
 
-        private AsyncState(boolean isAsync, boolean isStarted,
+        private AsyncState(boolean isAsync, boolean isStarted, boolean 
canComplete,
                 boolean isDispatching) {
             this.isAsync = isAsync;
             this.isStarted = isStarted;
+            this.canComplete = canComplete;
             this.isDispatching = isDispatching;
         }
 
         public boolean isAsync() {
-            return this.isAsync;
+            return isAsync;
         }
 
         public boolean isStarted() {
-            return this.isStarted;
+            return isStarted;
         }
 
         public boolean isDispatching() {
-            return this.isDispatching;
+            return isDispatching;
+        }
+
+        public boolean canComplete() {
+            return canComplete;
         }
     }
 
@@ -174,6 +179,10 @@ public class AsyncStateMachine {
         return state == AsyncState.ERROR;
     }
 
+    public boolean canComplete() {
+        return state.canComplete();
+    }
+
     public synchronized void asyncStart(AsyncContextCallback asyncCtxt) {
         if (state == AsyncState.DISPATCHED) {
             state = AsyncState.STARTING;

Modified: tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1635301&r1=1635300&r2=1635301&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java Wed Oct 
29 21:01:06 2014
@@ -522,6 +522,10 @@ public abstract class AbstractAjpProcess
             getSocketWrapper().access();
             break;
         }
+        case ASYNC_CAN_COMPLETE: {
+            ((AtomicBoolean) param).set(asyncStateMachine.canComplete());
+            break;
+        }
         case ASYNC_COMPLETE: {
             socketWrapper.clearDispatches();
             if (asyncStateMachine.asyncComplete()) {



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to