Author: markt Date: Thu Apr 7 16:19:55 2016 New Revision: 1738149 URL: http://svn.apache.org/viewvc?rev=1738149&view=rev Log: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=59261 ServletRequest.getAsyncContext() now throws an IllegalStateException as required by the Servlet specification if the request is not in asynchronous mode when called.
Modified: tomcat/trunk/java/javax/servlet/ServletRequest.java tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties tomcat/trunk/java/org/apache/catalina/connector/Request.java tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/javax/servlet/ServletRequest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/ServletRequest.java?rev=1738149&r1=1738148&r2=1738149&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/ServletRequest.java (original) +++ tomcat/trunk/java/javax/servlet/ServletRequest.java Thu Apr 7 16:19:55 2016 @@ -481,9 +481,14 @@ public interface ServletRequest { public boolean isAsyncSupported(); /** - * @return TODO + * Get the current AsyncContext. + * + * @return The current AsyncContext + * * @throws IllegalStateException if the request is not in asynchronous mode - * @since Servlet 3.0 TODO SERVLET3 - Add comments + * (i.e. @link #isAsyncStarted() is {@code false}) + * + * @since Servlet 3.0 */ public AsyncContext getAsyncContext(); 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=1738149&r1=1738148&r2=1738149&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu Apr 7 16:19:55 2016 @@ -136,7 +136,7 @@ public class CoyoteAdapter implements Ad "Dispatch may only happen on an existing request."); } boolean success = true; - AsyncContextImpl asyncConImpl = (AsyncContextImpl)request.getAsyncContext(); + AsyncContextImpl asyncConImpl = request.getAsyncContextInternal(); req.getRequestProcessor().setWorkerThreadName(Thread.currentThread().getName()); try { if (!request.isAsync()) { Modified: tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1738149&r1=1738148&r2=1738149&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties Thu Apr 7 16:19:55 2016 @@ -71,6 +71,7 @@ outputBuffer.writeNull=The String argume request.asyncNotSupported=A filter or servlet of the current chain does not support asynchronous operations. request.illegalWrap=The request wrapper must wrap the request obtained from getRequest() +request.notAsync=It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false) requestFacade.nullRequest=The request object has been recycled and is no longer associated with this facade Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1738149&r1=1738148&r2=1738149&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Thu Apr 7 16:19:55 2016 @@ -412,7 +412,7 @@ public class Request implements HttpServ /** * AsyncContext */ - protected volatile AsyncContextImpl asyncContext = null; + private volatile AsyncContextImpl asyncContext = null; protected Boolean asyncSupported = null; @@ -1695,7 +1695,14 @@ public class Request implements HttpServ @Override public AsyncContext getAsyncContext() { - return this.asyncContext; + if (!isAsyncStarted()) { + throw new IllegalStateException(sm.getString("request.notAsync")); + } + return asyncContext; + } + + public AsyncContextImpl getAsyncContextInternal() { + return asyncContext; } @Override Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java?rev=1738149&r1=1738148&r2=1738149&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java Thu Apr 7 16:19:55 2016 @@ -375,7 +375,7 @@ final class ApplicationDispatcher implem processRequest(request,response,state); } - if (request.getAsyncContext() != null) { + if (request.isAsyncStarted()) { // An async request was started during the forward, don't close the // response as it may be written to during the async handling return; Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java?rev=1738149&r1=1738148&r2=1738149&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java Thu Apr 7 16:19:55 2016 @@ -180,7 +180,7 @@ final class StandardWrapperValve try { SystemLogHandler.startCapture(); if (request.isAsyncDispatching()) { - ((AsyncContextImpl)request.getAsyncContext()).doInternalDispatch(); + request.getAsyncContextInternal().doInternalDispatch(); } else { filterChain.doFilter(request.getRequest(), response.getResponse()); @@ -193,7 +193,7 @@ final class StandardWrapperValve } } else { if (request.isAsyncDispatching()) { - ((AsyncContextImpl)request.getAsyncContext()).doInternalDispatch(); + request.getAsyncContextInternal().doInternalDispatch(); } else { filterChain.doFilter (request.getRequest(), response.getResponse()); Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1738149&r1=1738148&r2=1738149&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Thu Apr 7 16:19:55 2016 @@ -108,6 +108,12 @@ <code>TransientAttribute</code>. (kfujino) </fix> <fix> + <bug>59261</bug>: <code>ServletRequest.getAsyncContext()</code> now + throws an <code>IllegalStateException</code> as required by the Servlet + specification if the request is not in asynchronous mode when called. + (markt) + </fix> + <fix> <bug>59269</bug>: Correct the implementation of <code>PersistentManagerBase</code> so that <code>minIdleSwap</code> functions as designed and sessions are swapped out to keep the active --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org