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 2011/04/23 23:27:54 UTC

svn commit: r1096235 - in /tomcat/trunk: java/org/apache/catalina/core/AsyncContextImpl.java test/org/apache/catalina/core/TestAsyncContextImpl.java webapps/docs/changelog.xml

Author: markt
Date: Sat Apr 23 21:27:54 2011
New Revision: 1096235

URL: http://svn.apache.org/viewvc?rev=1096235&view=rev
Log:
Ensure response is committed when AsyncContext#complete() is called.

Modified:
    tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
    tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.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=1096235&r1=1096234&r2=1096235&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Sat Apr 23 21:27:54 2011
@@ -80,6 +80,7 @@ public class AsyncContextImpl implements
         if (log.isDebugEnabled()) {
             logDebug("complete   ");
         }
+        request.getCoyoteRequest().action(ActionCode.COMMIT, null);
         request.getCoyoteRequest().action(ActionCode.ASYNC_COMPLETE, null);
     }
 

Modified: tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java?rev=1096235&r1=1096234&r2=1096235&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java (original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java Sat Apr 23 21:27:54 2011
@@ -1050,4 +1050,66 @@ public class TestAsyncContextImpl extend
             assertTrue(entry.toString(), entry.getTime() < maxTime);
         }
     }
+    
+    public void testCommitOnComplete() throws Exception {
+        // Setup Tomcat instance
+        Tomcat tomcat = getTomcatInstance();
+        
+        // Must have a real docBase - just use temp
+        File docBase = new File(System.getProperty("java.io.tmpdir"));
+        
+        Context ctx = tomcat.addContext("", docBase.getAbsolutePath());
+
+        AsyncStatusServlet asyncStatusServlet =
+            new AsyncStatusServlet(HttpServletResponse.SC_BAD_REQUEST);
+        Wrapper wrapper =
+            Tomcat.addServlet(ctx, "asyncStatusServlet", asyncStatusServlet);
+        wrapper.setAsyncSupported(true);
+        ctx.addServletMapping("/asyncStatusServlet", "asyncStatusServlet");
+
+        TesterAccessLogValve alv = new TesterAccessLogValve();
+        ctx.getPipeline().addValve(alv);
+        
+        tomcat.start();
+        
+        StringBuilder url = new StringBuilder(48);
+        url.append("http://localhost:");
+        url.append(getPort());
+        url.append("/asyncStatusServlet");
+        
+        int rc = getUrl(url.toString(), new ByteChunk(), null);
+        
+        assertEquals(HttpServletResponse.SC_BAD_REQUEST, rc);
+        
+        // Without this test may complete before access log has a chance to log
+        // the request
+        Thread.sleep(REQUEST_TIME);
+        
+        // Check the access log
+        validateAccessLog(alv, 1, HttpServletResponse.SC_BAD_REQUEST, 0,
+                REQUEST_TIME);
+
+    }
+
+    private static class AsyncStatusServlet extends HttpServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        private int status = 200;
+
+        public AsyncStatusServlet(int status) {
+            this.status = status;
+        }
+        
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+                throws ServletException, IOException {
+            
+            AsyncContext actxt = req.startAsync();
+            resp.setStatus(status);
+            actxt.complete();
+        }
+    }
+    
+
 }

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1096235&r1=1096234&r2=1096235&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Sat Apr 23 21:27:54 2011
@@ -86,6 +86,10 @@
         directly. This change significantly improves startup performance for
         applications with lots of JARs to be scanned. (markt)
       </fix>
+      <fix>
+        Ensure response is committed when <code>AsyncContext#complete()</code>
+        is called. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



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