Author: fhanik Date: Thu Aug 6 22:19:08 2009 New Revision: 801824 URL: http://svn.apache.org/viewvc?rev=801824&view=rev Log: Add in handling of async supported for filters during regular invokation and a dispatch
Modified: tomcat/trunk/java/org/apache/catalina/Globals.java tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 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/ApplicationHttpRequest.java Modified: tomcat/trunk/java/org/apache/catalina/Globals.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Globals.java?rev=801824&r1=801823&r2=801824&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/Globals.java (original) +++ tomcat/trunk/java/org/apache/catalina/Globals.java Thu Aug 6 22:19:08 2009 @@ -329,6 +329,11 @@ */ public static final boolean IS_SECURITY_ENABLED = (System.getSecurityManager() != null); - + + /** + * + */ + public static final String ASYNC_SUPPORTED_ATTR = + "org.apache.catalina.ASYNC_SUPPORTED"; } Modified: tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java?rev=801824&r1=801823&r2=801824&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/AsyncContextImpl.java Thu Aug 6 22:19:08 2009 @@ -24,6 +24,7 @@ import javax.servlet.AsyncContext; import javax.servlet.AsyncListener; +import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -33,6 +34,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.catalina.Context; +import org.apache.catalina.Globals; import org.apache.coyote.ActionCode; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; @@ -110,14 +112,18 @@ final HttpServletResponse servletResponse = (HttpServletResponse)getResponse(); Runnable run = new Runnable() { public void run() { + DispatcherType type = (DispatcherType)request.getAttribute(Globals.DISPATCHER_TYPE_ATTR); try { //piggy back on the request dispatcher to ensure that filters etc get called. //TODO SERVLET3 - async should this be include/forward or a new dispatch type //javadoc suggests include with the type of DispatcherType.ASYNC + request.setAttribute(Globals.DISPATCHER_TYPE_ATTR, DispatcherType.ASYNC); requestDispatcher.include(servletRequest, servletResponse); }catch (Exception x) { //log.error("Async.dispatch",x); throw new RuntimeException(x); + }finally { + request.setAttribute(Globals.DISPATCHER_TYPE_ATTR, type); } } }; 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=801824&r1=801823&r2=801824&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu Aug 6 22:19:08 2009 @@ -263,8 +263,6 @@ boolean success = true; try { - DispatcherType prevDispatcherType = request.getDispatcherType(); - request.setAttribute(Globals.DISPATCHER_TYPE_ATTR, DispatcherType.ASYNC); // Calling the container try { if (status==SocketStatus.TIMEOUT) { @@ -283,7 +281,6 @@ }catch (RuntimeException x) { success = false; } finally { - request.setAttribute(Globals.DISPATCHER_TYPE_ATTR, prevDispatcherType); } if (request.isComet()) { 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=801824&r1=801823&r2=801824&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Thu Aug 6 22:19:08 2009 @@ -386,11 +386,6 @@ protected String localName = null; /** - * asyncSupported - */ - protected boolean asyncSupported = true; - - /** * AsyncContext */ protected AsyncContextImpl asyncContext = null; @@ -400,6 +395,8 @@ */ protected long asyncTimeout = 0; + protected Boolean asyncSupported = null; + // --------------------------------------------------------- Public Methods @@ -407,7 +404,7 @@ public void setAsyncSupported(boolean asyncSupported) { - this.asyncSupported = asyncSupported; + asyncSupported = asyncSupported?Boolean.TRUE:Boolean.FALSE; } /** @@ -483,7 +480,7 @@ } } - asyncSupported = true; + asyncSupported = null; if (asyncContext!=null) asyncContext.recycle(); } @@ -850,6 +847,10 @@ ? getRequestPathMB().toString() : requestDispatcherPath.toString(); } + + if (name.equals(Globals.ASYNC_SUPPORTED_ATTR)) { + return isAsyncSupported(); + } Object attr=attributes.get(name); @@ -1370,6 +1371,10 @@ requestDispatcherPath = value; return; } + + if (name.equals(Globals.ASYNC_SUPPORTED_ATTR)) { + this.asyncSupported = (Boolean)value; + } Object oldValue = null; boolean replaced = false; @@ -1487,7 +1492,11 @@ public boolean isAsyncSupported() { // TODO SERVLET3 - async - return this.asyncSupported; + if (this.asyncSupported==null) { + return true; + } else { + return asyncSupported.booleanValue(); + } } public AsyncContext getAsyncContext() { 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=801824&r1=801823&r2=801824&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java Thu Aug 6 22:19:08 2009 @@ -47,6 +47,8 @@ import org.apache.catalina.connector.Response; import org.apache.catalina.connector.ResponseFacade; import org.apache.catalina.util.InstanceSupport; +import org.apache.juli.logging.Log; +import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.res.StringManager; /** @@ -66,6 +68,7 @@ final class ApplicationDispatcher implements RequestDispatcher { + protected static Log log = LogFactory.getLog(ApplicationDispatcher.class); protected class PrivilegedForward implements PrivilegedExceptionAction<Void> { @@ -637,6 +640,16 @@ ApplicationFilterFactory factory = ApplicationFilterFactory.getInstance(); ApplicationFilterChain filterChain = factory.createFilterChain(request, wrapper,servlet); + + Object asyncSupported = request.getAttribute(Globals.ASYNC_SUPPORTED_ATTR); + //we have a new filter chain, setup isAsyncSupported here + boolean filterAsyncSupported = filterChain.isAsyncSupported(); + if (!filterAsyncSupported && request.isAsyncSupported()) { + //the request says we support it, but the filters don't + //TODO SERVLET3 - async + request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, Boolean.FALSE); + } + // Call the service() method for the allocated servlet instance try { String jspFile = wrapper.getJspFile(); @@ -691,6 +704,8 @@ wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException", wrapper.getName()), e); runtimeException = e; + } finally { + request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, asyncSupported); } // Release the filter chain (if any) for this request @@ -777,8 +792,7 @@ } } - - + /** * Unwrap the response if we have wrapped it. */ Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java?rev=801824&r1=801823&r2=801824&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java (original) +++ tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java Thu Aug 6 22:19:08 2009 @@ -196,7 +196,7 @@ * Special attributes. */ protected Object[] specialAttributes = new Object[specials.length]; - + // ------------------------------------------------- ServletRequest Methods @@ -741,10 +741,8 @@ this.queryParamString = queryString; } - // ------------------------------------------------------ Protected Methods - /** * Is this attribute name one of the special ones that is added only for * included servlets? --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org