From bc0773ae5d205861239ef9cfe39a83cdf8830d4a Mon Sep 17 00:00:00 2001 From: markt Date: Sat, 23 Apr 2011 21:27:54 +0000 Subject: [PATCH] Ensure response is committed when AsyncContext#complete() is called. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1096235 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/catalina/core/AsyncContextImpl.java | 1 + .../apache/catalina/core/TestAsyncContextImpl.java | 62 ++++++++++++++++++++++ webapps/docs/changelog.xml | 4 ++ 3 files changed, 67 insertions(+) diff --git a/java/org/apache/catalina/core/AsyncContextImpl.java b/java/org/apache/catalina/core/AsyncContextImpl.java index 807b7f0ae..b36ce22e1 100644 --- a/java/org/apache/catalina/core/AsyncContextImpl.java +++ b/java/org/apache/catalina/core/AsyncContextImpl.java @@ -80,6 +80,7 @@ public class AsyncContextImpl implements AsyncContext, AsyncContextCallback { if (log.isDebugEnabled()) { logDebug("complete "); } + request.getCoyoteRequest().action(ActionCode.COMMIT, null); request.getCoyoteRequest().action(ActionCode.ASYNC_COMPLETE, null); } diff --git a/test/org/apache/catalina/core/TestAsyncContextImpl.java b/test/org/apache/catalina/core/TestAsyncContextImpl.java index 31ad086e8..8cb5c7f09 100644 --- a/test/org/apache/catalina/core/TestAsyncContextImpl.java +++ b/test/org/apache/catalina/core/TestAsyncContextImpl.java @@ -1050,4 +1050,66 @@ public class TestAsyncContextImpl extends TomcatBaseTest { 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(); + } + } + + } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 62dc2b60a..28548fab9 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -86,6 +86,10 @@ directly. This change significantly improves startup performance for applications with lots of JARs to be scanned. (markt) + + Ensure response is committed when AsyncContext#complete() + is called. (markt) + -- 2.11.0