Author: markt
Date: Wed May 18 17:25:28 2011
New Revision: 1124342
URL: http://svn.apache.org/viewvc?rev=1124342&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51197
Fix possible dropped connection when sendError or sendRedirst are used during
async processing.
Modified:
tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1124342&r1=1124341&r2=1124342&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Wed May
18 17:25:28 2011
@@ -277,6 +277,9 @@ public class CoyoteAdapter implements Ad
if (ctxt != null) {
ctxt.fireRequestDestroyEvent(request);
}
+ // Lift any suspension (e.g. if sendError() was used by an
async
+ // request
+ response.setSuspended(false);
}
if (status==SocketStatus.TIMEOUT) {
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=1124342&r1=1124341&r2=1124342&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java
(original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java Wed
May 18 17:25:28 2011
@@ -49,6 +49,8 @@ public class TestAsyncContextImpl extend
private static final long REQUEST_TIME = 500;
// Timeout thread (where used) checks for timeout every second
private static final long TIMEOUT_MARGIN = 1000;
+ // Default timeout for these tests
+ private static final long TIMEOUT = 3000;
public void testBug49528() throws Exception {
// Setup Tomcat instance
@@ -1112,4 +1114,74 @@ public class TestAsyncContextImpl extend
}
+ public void testBug51197() 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());
+
+ AsyncErrorServlet asyncErrorServlet =
+ new AsyncErrorServlet(HttpServletResponse.SC_BAD_REQUEST);
+ Wrapper wrapper =
+ Tomcat.addServlet(ctx, "asyncErrorServlet", asyncErrorServlet);
+ wrapper.setAsyncSupported(true);
+ ctx.addServletMapping("/asyncErrorServlet", "asyncErrorServlet");
+
+ TesterAccessLogValve alv = new TesterAccessLogValve();
+ ctx.getPipeline().addValve(alv);
+
+ tomcat.start();
+
+ StringBuilder url = new StringBuilder(48);
+ url.append("http://localhost:");
+ url.append(getPort());
+ url.append("/asyncErrorServlet");
+
+ 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, TIMEOUT,
+ TIMEOUT + TIMEOUT_MARGIN + REQUEST_TIME);
+
+ }
+
+ private static class AsyncErrorServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ private int status = 200;
+
+ public AsyncErrorServlet(int status) {
+ this.status = status;
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+
+ final AsyncContext actxt = req.startAsync();
+ actxt.setTimeout(TIMEOUT);
+ actxt.start(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ ((HttpServletResponse) actxt.getResponse()).sendError(
+ status);
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ });
+ }
+ }
+
}
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1124342&r1=1124341&r2=1124342&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Wed May 18 17:25:28 2011
@@ -101,6 +101,10 @@
get returned with requests mapped to a context with a path of
<code>/foobar</code>. (markt)
</fix>
+ <fix>
+ <bug>51197</bug>: Fix possible dropped connection when sendError or
+ sendRedirst are used during async processing. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Jasper">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]