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