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: [email protected]
For additional commands, e-mail: [email protected]