Author: violetagg Date: Fri Mar 25 19:42:02 2016 New Revision: 1736648 URL: http://svn.apache.org/viewvc?rev=1736648&view=rev Log: Merged revision 1736646 from tomcat/trunk: Ensure that ServletRequest and ServletResponse provided during AsyncListener registration are made available via AsyncEvent.getSuppliedRequest and AsyncEvent.getSuppliedResponse
Modified: tomcat/tc8.5.x/trunk/ (props changed) tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncListenerWrapper.java tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml Propchange: tomcat/tc8.5.x/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri Mar 25 19:42:02 2016 @@ -1 +1 @@ -/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489 +/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646 Modified: tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=1736648&r1=1736647&r2=1736648&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Fri Mar 25 19:42:02 2016 @@ -272,6 +272,8 @@ public class AsyncContextImpl implements check(); AsyncListenerWrapper wrapper = new AsyncListenerWrapper(); wrapper.setListener(listener); + wrapper.setServletRequest(servletRequest); + wrapper.setServletResponse(servletResponse); listeners.add(wrapper); } Modified: tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncListenerWrapper.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncListenerWrapper.java?rev=1736648&r1=1736647&r2=1736648&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncListenerWrapper.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/AsyncListenerWrapper.java Fri Mar 25 19:42:02 2016 @@ -20,29 +20,33 @@ import java.io.IOException; import javax.servlet.AsyncEvent; import javax.servlet.AsyncListener; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; public class AsyncListenerWrapper { private AsyncListener listener = null; + private ServletRequest servletRequest = null; + private ServletResponse servletResponse = null; public void fireOnStartAsync(AsyncEvent event) throws IOException { - listener.onStartAsync(event); + listener.onStartAsync(customizeEvent(event)); } public void fireOnComplete(AsyncEvent event) throws IOException { - listener.onComplete(event); + listener.onComplete(customizeEvent(event)); } public void fireOnTimeout(AsyncEvent event) throws IOException { - listener.onTimeout(event); + listener.onTimeout(customizeEvent(event)); } public void fireOnError(AsyncEvent event) throws IOException { - listener.onError(event); + listener.onError(customizeEvent(event)); } @@ -56,4 +60,22 @@ public class AsyncListenerWrapper { } + public void setServletRequest(ServletRequest servletRequest) { + this.servletRequest = servletRequest; + } + + + public void setServletResponse(ServletResponse servletResponse) { + this.servletResponse = servletResponse; + } + + + private AsyncEvent customizeEvent(AsyncEvent event) { + if (servletRequest != null && servletResponse != null) { + return new AsyncEvent(event.getAsyncContext(), servletRequest, servletResponse, + event.getThrowable()); + } else { + return event; + } + } } Modified: tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java?rev=1736648&r1=1736647&r2=1736648&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java (original) +++ tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java Fri Mar 25 19:42:02 2016 @@ -52,11 +52,15 @@ import org.junit.Test; import org.apache.catalina.Context; import org.apache.catalina.Wrapper; +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; import org.apache.catalina.valves.TesterAccessLogValve; +import org.apache.tomcat.unittest.TesterContext; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.descriptor.web.ErrorPage; +import org.easymock.EasyMock; public class TestAsyncContextImpl extends TomcatBaseTest { @@ -2358,4 +2362,49 @@ public class TestAsyncContextImpl extend } } + + + @Test + public void testAsyncListenerSupplyRequestResponse() { + final ServletRequest servletRequest = EasyMock.createMock(ServletRequest.class); + final ServletResponse servletResponse = EasyMock.createMock(ServletResponse.class); + final AsyncListener listener = new AsyncListener() { + + @Override + public void onTimeout(AsyncEvent event) throws IOException { + checkRequestResponse(event); + } + + @Override + public void onStartAsync(AsyncEvent event) throws IOException { + checkRequestResponse(event); + } + + @Override + public void onError(AsyncEvent event) throws IOException { + checkRequestResponse(event); + } + + @Override + public void onComplete(AsyncEvent event) throws IOException { + checkRequestResponse(event); + } + + private void checkRequestResponse(AsyncEvent event) { + assertEquals(servletRequest, event.getSuppliedRequest()); + assertEquals(servletResponse, event.getSuppliedResponse()); + } + }; + final Context context = new TesterContext(); + final Response response = new Response(); + final Request request = new Request(); + request.setCoyoteRequest(new org.apache.coyote.Request()); + request.getMappingData().context = context; + final AsyncContextImpl ac = new AsyncContextImpl(request); + ac.addListener(listener, servletRequest, servletResponse); + ac.setStarted(context, request, response, true); + ac.addListener(listener, servletRequest, servletResponse); + ac.setErrorState(new Exception(), true); + ac.fireOnComplete(); + } } Modified: tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml?rev=1736648&r1=1736647&r2=1736648&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml Fri Mar 25 19:42:02 2016 @@ -66,6 +66,14 @@ <bug>59213</bug>: Async dispatches should be based off a wrapped request. (remm) </fix> + <fix> + Ensure that <code>javax.servlet.ServletRequest</code> and + <code>javax.servlet.ServletResponse</code> provided during + <code>javax.servlet.AsyncListener</code> registration are made + available via <code>javax.servlet.AsyncEvent.getSuppliedRequest</code> + and <code>javax.servlet.AsyncEvent.getSuppliedResponse</code> + (violetagg) + </fix> </changelog> </subsection> <subsection name="WebSocket"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org