You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/02/24 00:34:34 UTC

svn commit: r1661820 - in /felix/trunk/http: base/src/main/java/org/apache/felix/http/base/internal/dispatch/ base/src/main/java/org/apache/felix/http/base/internal/runtime/ jetty/src/main/java/org/apache/felix/http/jetty/internal/

Author: cziegeler
Date: Mon Feb 23 23:34:33 2015
New Revision: 1661820

URL: http://svn.apache.org/r1661820
Log:
FELIX-4798 : Support async servlets (filters)

Modified:
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
    felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
    felix/trunk/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java?rev=1661820&r1=1661819&r2=1661820&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/dispatch/Dispatcher.java Mon Feb 23 23:34:33 2015
@@ -34,6 +34,7 @@ import java.io.IOException;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.servlet.AsyncContext;
 import javax.servlet.DispatcherType;
 import javax.servlet.FilterChain;
 import javax.servlet.RequestDispatcher;
@@ -91,7 +92,8 @@ public final class Dispatcher implements
 
             try
             {
-                ServletRequestWrapper req = new ServletRequestWrapper((HttpServletRequest) request, this.handler.getContext(), this.requestInfo, DispatcherType.FORWARD, this.handler.getContextServiceId());
+                ServletRequestWrapper req = new ServletRequestWrapper((HttpServletRequest) request, this.handler.getContext(), this.requestInfo, DispatcherType.FORWARD, this.handler.getContextServiceId(),
+                        handler.getServletInfo().isAsyncSupported());
                 Dispatcher.this.forward(this.handler, req, (HttpServletResponse) response);
             }
             finally
@@ -109,7 +111,8 @@ public final class Dispatcher implements
         @Override
         public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException
         {
-            ServletRequestWrapper req = new ServletRequestWrapper((HttpServletRequest) request, this.handler.getContext(), this.requestInfo, DispatcherType.INCLUDE, this.handler.getContextServiceId());
+            ServletRequestWrapper req = new ServletRequestWrapper((HttpServletRequest) request, this.handler.getContext(), this.requestInfo, DispatcherType.INCLUDE,
+                    this.handler.getContextServiceId(), handler.getServletInfo().isAsyncSupported());
             Dispatcher.this.include(this.handler, req, (HttpServletResponse) response);
         }
     }
@@ -205,7 +208,8 @@ public final class Dispatcher implements
 
                                 final FilterHandler[] filterHandlers = handlerRegistry.getFilterHandlers(errorHandler, DispatcherType.ERROR, request.getRequestURI());
 
-                                invokeChain(filterHandlers, errorHandler, new ServletRequestWrapper(request, errorHandler.getContext(), requestInfo, this.serviceId), this);
+                                // TODO - is async = false correct?
+                                invokeChain(filterHandlers, errorHandler, new ServletRequestWrapper(request, errorHandler.getContext(), requestInfo, this.serviceId, false), this);
 
                                 invokeSuper = false;
                             }
@@ -239,17 +243,20 @@ public final class Dispatcher implements
         private final RequestInfo requestInfo;
         private final ExtServletContext servletContext;
         private final Long contextId;
+        private final boolean asyncSupported;
 
-        public ServletRequestWrapper(HttpServletRequest req, ExtServletContext servletContext, RequestInfo requestInfo, final Long contextId)
+        public ServletRequestWrapper(HttpServletRequest req, ExtServletContext servletContext, RequestInfo requestInfo, final Long contextId,
+                final boolean asyncSupported)
         {
-            this(req, servletContext, requestInfo, null /* type */, contextId);
+            this(req, servletContext, requestInfo, null /* type */, contextId, asyncSupported);
         }
 
         public ServletRequestWrapper(HttpServletRequest req, ExtServletContext servletContext, RequestInfo requestInfo,
-                DispatcherType type, final Long contextId)
+                DispatcherType type, final Long contextId, final boolean asyncSupported)
         {
             super(req);
 
+            this.asyncSupported = asyncSupported;
             this.servletContext = servletContext;
             this.requestInfo = requestInfo;
             this.type = type;
@@ -497,6 +504,33 @@ public final class Dispatcher implements
         {
             return (DispatcherType.INCLUDE == this.type) && (this.requestInfo != null);
         }
+
+        @Override
+        public AsyncContext startAsync() throws IllegalStateException
+        {
+            if ( !this.asyncSupported )
+            {
+                throw new IllegalStateException();
+            }
+            return super.startAsync();
+        }
+
+        @Override
+        public AsyncContext startAsync(final ServletRequest servletRequest,
+                final ServletResponse servletResponse) throws IllegalStateException
+        {
+            if ( !this.asyncSupported )
+            {
+                throw new IllegalStateException();
+            }
+            return super.startAsync(servletRequest, servletResponse);
+        }
+
+        @Override
+        public boolean isAsyncSupported()
+        {
+            return this.asyncSupported;
+        }
     }
 
     private static class RequestInfo
@@ -586,7 +620,8 @@ public final class Dispatcher implements
         ExtServletContext servletContext = (servletHandler != null) ? servletHandler.getContext() : null;
         final RequestInfo requestInfo = new RequestInfo(servletPath, pathInfo, queryString);
 
-        final HttpServletRequest wrappedRequest = new ServletRequestWrapper(req, servletContext, requestInfo, servletHandler.getContextServiceId());
+        final HttpServletRequest wrappedRequest = new ServletRequestWrapper(req, servletContext, requestInfo, servletHandler.getContextServiceId(),
+                servletHandler.getServletInfo().isAsyncSupported());
         final FilterHandler[] filterHandlers = this.handlerRegistry.getFilterHandlers(servletHandler, req.getDispatcherType(), requestURI);
 
         try

Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java?rev=1661820&r1=1661819&r2=1661820&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/runtime/ServletInfo.java Mon Feb 23 23:34:33 2015
@@ -117,7 +117,7 @@ public final class ServletInfo extends W
             this.patterns = new String[] {pattern, pattern + "/*"};
         }
         this.initParams = initParams;
-        this.asyncSupported = false;
+        this.asyncSupported = true;
         this.errorPage = null;
     }
 

Modified: felix/trunk/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java?rev=1661820&r1=1661819&r2=1661820&view=diff
==============================================================================
--- felix/trunk/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java (original)
+++ felix/trunk/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java Mon Feb 23 23:34:33 2015
@@ -247,7 +247,9 @@ public final class JettyService extends
             configureSessionManager(context);
             context.addEventListener(eventDispatcher);
             context.getSessionHandler().addEventListener(eventDispatcher);
-            context.addServlet(new ServletHolder(this.dispatcher), "/*");
+            final ServletHolder holder = new ServletHolder(this.dispatcher);
+            holder.setAsyncSupported(true);
+            context.addServlet(holder, "/*");
             context.setMaxFormContentSize(this.config.getMaxFormSize());
 
             if (this.config.isRegisterMBeans())