Author: remm
Date: Fri Nov  3 14:31:36 2017
New Revision: 1814192

URL: http://svn.apache.org/viewvc?rev=1814192&view=rev
Log:
61681: Allow HTTP/2 push when using a request wrapper. The main problem is that 
newPUshBuilder doesn't allow passing the base request, unlike startAsync, so 
add an extra proprietary method to do it. The request wrappers will then have 
to use reflection or cast to the base RequestFacade type.

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java
    tomcat/trunk/java/org/apache/catalina/filters/RemoteIpFilter.java
    tomcat/trunk/webapps/docs/changelog.xml

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=1814192&r1=1814191&r2=1814192&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Fri Nov  3 
14:31:36 2017
@@ -1962,10 +1962,15 @@ public class Request implements HttpServ
 
     @Override
     public PushBuilder newPushBuilder() {
+        return newPushBuilder(this);
+    }
+
+
+    public PushBuilder newPushBuilder(HttpServletRequest request) {
         AtomicBoolean result = new AtomicBoolean();
         coyoteRequest.action(ActionCode.IS_PUSH_SUPPORTED, result);
         if (result.get()) {
-            return new ApplicationPushBuilder(this);
+            return new ApplicationPushBuilder(this, request);
         } else {
             return null;
         }

Modified: tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java?rev=1814192&r1=1814191&r2=1814192&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java Fri Nov  
3 14:31:36 2017
@@ -1130,6 +1130,11 @@ public class RequestFacade implements Ht
     }
 
 
+    public PushBuilder newPushBuilder(HttpServletRequest request) {
+        return this.request.newPushBuilder(request);
+    }
+
+
     @Override
     public boolean isTrailerFieldsReady() {
         return request.isTrailerFieldsReady();

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=1814192&r1=1814191&r2=1814192&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java Fri 
Nov  3 14:31:36 2017
@@ -33,6 +33,8 @@ import java.util.NoSuchElementException;
 import javax.servlet.DispatcherType;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestWrapper;
 import javax.servlet.http.HttpServletMapping;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
@@ -43,6 +45,7 @@ import org.apache.catalina.Context;
 import org.apache.catalina.Globals;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Session;
+import org.apache.catalina.connector.RequestFacade;
 import org.apache.catalina.util.ParameterMap;
 import org.apache.catalina.util.RequestUtil;
 import org.apache.tomcat.util.buf.B2CConverter;
@@ -604,7 +607,15 @@ class ApplicationHttpRequest extends Htt
 
     @Override
     public PushBuilder newPushBuilder() {
-        return new ApplicationPushBuilder(this);
+        ServletRequest current = getRequest();
+        while (current instanceof ServletRequestWrapper) {
+            current = ((ServletRequestWrapper) current).getRequest();
+        }
+        if (current instanceof RequestFacade) {
+            return ((RequestFacade) current).newPushBuilder(this);
+        } else {
+            return null;
+        }
     }
 
 

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java?rev=1814192&r1=1814191&r2=1814192&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java Fri 
Nov  3 14:31:36 2017
@@ -26,8 +26,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletRequestWrapper;
 import javax.servlet.SessionTrackingMode;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
@@ -74,20 +72,11 @@ public class ApplicationPushBuilder impl
     private String sessionId;
 
 
-    public ApplicationPushBuilder(HttpServletRequest request) {
+    public ApplicationPushBuilder(Request catalinaRequest, HttpServletRequest 
request) {
+
         baseRequest = request;
-        // Need a reference to the CoyoteRequest in order to process the push
-        ServletRequest current = request;
-        while (current instanceof ServletRequestWrapper) {
-            current = ((ServletRequestWrapper) current).getRequest();
-        }
-        if (current instanceof Request) {
-            catalinaRequest = (Request) current;
-            coyoteRequest = catalinaRequest.getCoyoteRequest();
-        } else {
-            throw new UnsupportedOperationException(sm.getString(
-                    "applicationPushBuilder.noCoyoteRequest", 
current.getClass().getName()));
-        }
+        this.catalinaRequest = catalinaRequest;
+        coyoteRequest = catalinaRequest.getCoyoteRequest();
 
         // Populate the initial list of HTTP headers
         Enumeration<String> headerNames = request.getHeaderNames();
@@ -169,7 +158,6 @@ public class ApplicationPushBuilder impl
         }
     }
 
-
     @Override
     public PushBuilder path(String path) {
         if (path.startsWith("/")) {

Modified: tomcat/trunk/java/org/apache/catalina/filters/RemoteIpFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/filters/RemoteIpFilter.java?rev=1814192&r1=1814191&r2=1814192&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/filters/RemoteIpFilter.java (original)
+++ tomcat/trunk/java/org/apache/catalina/filters/RemoteIpFilter.java Fri Nov  
3 14:31:36 2017
@@ -35,6 +35,7 @@ import javax.servlet.FilterChain;
 import javax.servlet.GenericFilter;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestWrapper;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
@@ -43,7 +44,7 @@ import javax.servlet.http.PushBuilder;
 
 import org.apache.catalina.AccessLog;
 import org.apache.catalina.Globals;
-import org.apache.catalina.core.ApplicationPushBuilder;
+import org.apache.catalina.connector.RequestFacade;
 import org.apache.catalina.util.RequestUtil;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
@@ -627,7 +628,15 @@ public class RemoteIpFilter extends Gene
 
         @Override
         public PushBuilder newPushBuilder() {
-            return new ApplicationPushBuilder(this);
+            ServletRequest current = getRequest();
+            while (current instanceof ServletRequestWrapper) {
+                current = ((ServletRequestWrapper) current).getRequest();
+            }
+            if (current instanceof RequestFacade) {
+                return ((RequestFacade) current).newPushBuilder(this);
+            } else {
+                return null;
+            }
         }
     }
 

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1814192&r1=1814191&r2=1814192&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Nov  3 14:31:36 2017
@@ -60,6 +60,9 @@
         <bug>61601</bug>: Add support for multi-release JARs in JAR scanning 
and
         web application class loading. (markt)
       </fix>
+      <fix>
+        <bug>61681</bug>: Allow HTTP/2 push when using request wrapping. (remm)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to