Author: markt
Date: Tue Jun 11 20:18:10 2013
New Revision: 1491940
URL: http://svn.apache.org/r1491940
Log:
Servlet 3.1 requires an ISE if getRequest() or getResponse() are called after
complete() or dispatch()
Modified:
tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java
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=1491940&r1=1491939&r2=1491940&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Tue Jun 11
20:18:10 2013
@@ -64,8 +64,8 @@ public class AsyncContextImpl implements
protected static final StringManager sm =
StringManager.getManager(Constants.Package);
- private ServletRequest servletRequest = null;
- private ServletResponse servletResponse = null;
+ private volatile ServletRequest servletRequest = null;
+ private volatile ServletResponse servletResponse = null;
private final List<AsyncListenerWrapper> listeners = new ArrayList<>();
private boolean hasOriginalRequestAndResponse = true;
private volatile Runnable dispatch = null;
@@ -90,6 +90,7 @@ public class AsyncContextImpl implements
check();
request.getCoyoteRequest().action(ActionCode.COMMIT, null);
request.getCoyoteRequest().action(ActionCode.ASYNC_COMPLETE, null);
+ clearServletRequestResposne();
}
@Override
@@ -222,17 +223,26 @@ public class AsyncContextImpl implements
this.dispatch = run;
this.request.getCoyoteRequest().action(ActionCode.ASYNC_DISPATCH,
null);
+ clearServletRequestResposne();
}
@Override
public ServletRequest getRequest() {
check();
+ if (servletRequest == null) {
+ throw new IllegalStateException(
+ sm.getString("asyncContextImpl.request.ise"));
+ }
return servletRequest;
}
@Override
public ServletResponse getResponse() {
check();
+ if (servletResponse == null) {
+ throw new IllegalStateException(
+ sm.getString("asyncContextImpl.response.ise"));
+ }
return servletResponse;
}
@@ -302,9 +312,13 @@ public class AsyncContextImpl implements
instanceManager = null;
listeners.clear();
request = null;
+ clearServletRequestResposne();
+ timeout = -1;
+ }
+
+ private void clearServletRequestResposne() {
servletRequest = null;
servletResponse = null;
- timeout = -1;
}
public boolean isStarted() {
Modified: tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1491940&r1=1491939&r2=1491940&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/LocalStrings.properties Tue Jun
11 20:18:10 2013
@@ -64,7 +64,9 @@ aprListener.tooLateForSSLRandomSeed=Cann
aprListener.tooLateForFIPSMode=Cannot setFIPSMode: SSL has already been
initialized
aprListener.initializedOpenSSL=OpenSSL successfully initialized ({0})
+asyncContextImpl.request.ise=It is illegal to call getRequest() after
complete() or any of the dispatch() methods has been called
asyncContextImpl.requestEnded=The request associated with the AsyncContext has
already completed processing.
+asyncContextImpl.response.ise=It is illegal to call getResponse() after
complete() or any of the dispatch() methods has been called
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.
containerBase.threadedStartFailed=A child container failed during start
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=1491940&r1=1491939&r2=1491940&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java
(original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java Tue
Jun 11 20:18:10 2013
@@ -1777,6 +1777,77 @@ public class TestAsyncContextImpl extend
resp.getWriter().println("OK");
}
}
+ }
+
+
+ @Test
+ public void testGetRequestISE() throws Exception {
+ doTestAsyncISE(true);
+ }
+
+
+ @Test
+ public void testGetResponseISE() throws Exception {
+ doTestAsyncISE(false);
+ }
+
+
+ private void doTestAsyncISE(boolean useGetRequest) 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());
+
+ Wrapper w = Tomcat.addServlet(ctx, "AsyncISEServlet",
+ new AsyncISEServlet(useGetRequest));
+ w.setAsyncSupported(true);
+ ctx.addServletMapping("/test", "AsyncISEServlet");
+
+ tomcat.start();
+
+ ByteChunk response = new ByteChunk();
+ int rc = getUrl("http://localhost:" + getPort() +"/test", response,
+ null);
+ Assert.assertEquals(HttpServletResponse.SC_OK, rc);
+ Assert.assertEquals("OK", response.toString());
+ }
+
+
+ private static class AsyncISEServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ private boolean useGetRequest = false;
+
+ public AsyncISEServlet(boolean useGetRequest) {
+ this.useGetRequest = useGetRequest;
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+
+ resp.setContentType("text/plain;UTF-8");
+ PrintWriter pw = resp.getWriter();
+
+ AsyncContext async = req.startAsync();
+ // This will commit the response
+ async.complete();
+
+ try {
+ if (useGetRequest) {
+ async.getRequest();
+ } else {
+ async.getResponse();
+ }
+ pw.print("FAIL");
+ } catch (IllegalStateException ise) {
+ pw.print("OK");
+ }
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]