Author: markt
Date: Tue Mar  8 10:29:44 2016
New Revision: 1734047

URL: http://svn.apache.org/viewvc?rev=1734047&view=rev
Log:
Based on EG discussion, add a method to allow applications to determine if push 
requests are supported. This is provided because populating a PushBuilder is a 
relatively expensive exercise.

Modified:
    tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java
    tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/java/org/apache/coyote/ActionCode.java
    tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java
    tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
    tomcat/trunk/java/org/apache/coyote/http2/Stream.java
    tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java

Modified: tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java?rev=1734047&r1=1734046&r2=1734047&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java (original)
+++ tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java Tue Mar  8 
10:29:44 2016
@@ -215,6 +215,18 @@ public interface HttpServletRequest exte
     public String getPathTranslated();
 
     /**
+     * Does the current request allow push requests. This will return {@code
+     * true} only if the underlying protocol supports server push and if pushes
+     * are permitted from the current request.
+     *
+     * @return {@code true} if server push is supported for the current request
+     *         otherwise {@code false}
+     */
+    public default boolean isPushSupported() {
+        return false;
+    }
+
+    /**
      * Obtain a builder for generating push requests. {@link PushBuilder}
      * documents how this request will be used as the basis for a push request.
      * Each call to this method will return a new instance, independent of any

Modified: tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java?rev=1734047&r1=1734046&r2=1734047&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java 
(original)
+++ tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java Tue Mar 
 8 10:29:44 2016
@@ -374,4 +374,17 @@ public class HttpServletRequestWrapper e
             Class<T> httpUpgradeHandlerClass) throws IOException, 
ServletException {
         return this._getHttpServletRequest().upgrade(httpUpgradeHandlerClass);
     }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * The default behavior of this method is to return
+     * {@link HttpServletRequest#isPushSupported()} on the wrapped request 
object.
+     *
+     * @since Servlet 4.0
+     */
+    @Override
+    public boolean isPushSupported() {
+        return this._getHttpServletRequest().isPushSupported();
+    }
 }

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=1734047&r1=1734046&r2=1734047&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Tue Mar  8 
10:29:44 2016
@@ -1896,6 +1896,19 @@ public class Request implements HttpServ
      * @since Servlet 4.0
      */
     @Override
+    public boolean isPushSupported() {
+        AtomicBoolean result = new AtomicBoolean();
+        coyoteRequest.action(ActionCode.IS_PUSH_SUPPORTED, result);
+        return result.get();
+    }
+
+
+    /**
+     * {@inheritDoc}
+     *
+     * @since Servlet 4.0
+     */
+    @Override
     public PushBuilder getPushBuilder() {
         return new ApplicationPushBuilder(this);
     }

Modified: tomcat/trunk/java/org/apache/coyote/ActionCode.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ActionCode.java?rev=1734047&r1=1734046&r2=1734047&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/ActionCode.java (original)
+++ tomcat/trunk/java/org/apache/coyote/ActionCode.java Tue Mar  8 10:29:44 2016
@@ -239,6 +239,11 @@ public enum ActionCode {
     END_REQUEST,
 
     /**
+     * Is server push supported and allowed for the current request?
+     */
+    IS_PUSH_SUPPORTED,
+
+    /**
      * Push a request on behalf of the client of the current request.
      */
     PUSH_REQUEST

Modified: tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java?rev=1734047&r1=1734046&r2=1734047&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/ajp/AjpProcessor.java Tue Mar  8 
10:29:44 2016
@@ -636,6 +636,12 @@ public class AjpProcessor extends Abstra
         }
 
         // Servlet 4.0 Push requests
+        case IS_PUSH_SUPPORTED: {
+            // HTTP2 connections only. Unsupported for AJP.
+            AtomicBoolean result = (AtomicBoolean) param;
+            result.set(false);
+            break;
+        }
         case PUSH_REQUEST: {
             // HTTP2 connections only. Unsupported for AJP.
             throw new UnsupportedOperationException(

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=1734047&r1=1734046&r2=1734047&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11Processor.java Tue Mar  8 
10:29:44 2016
@@ -942,6 +942,12 @@ public class Http11Processor extends Abs
         }
 
         // Servlet 4.0 Push requests
+        case IS_PUSH_SUPPORTED: {
+            // HTTP2 connections only. Unsupported for HTTP/1.x
+            AtomicBoolean result = (AtomicBoolean) param;
+            result.set(false);
+            break;
+        }
         case PUSH_REQUEST: {
             // HTTP2 connections only. Unsupported for AJP.
             throw new UnsupportedOperationException(

Modified: tomcat/trunk/java/org/apache/coyote/http2/Stream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Stream.java?rev=1734047&r1=1734046&r2=1734047&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Stream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Stream.java Tue Mar  8 10:29:44 
2016
@@ -382,8 +382,13 @@ public class Stream extends AbstractStre
     }
 
 
+    boolean isPushSupported() {
+        return handler.getRemoteSettings().getEnablePush();
+    }
+
+
     boolean push(Request request) throws IOException {
-        if (!handler.getRemoteSettings().getEnablePush()) {
+        if (!isPushSupported()) {
             return false;
         }
         // Set the special HTTP/2 headers

Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java?rev=1734047&r1=1734046&r2=1734047&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Tue Mar  8 
10:29:44 2016
@@ -353,6 +353,11 @@ public class StreamProcessor extends Abs
         }
 
         // Servlet 4.0 Push requests
+        case IS_PUSH_SUPPORTED: {
+            AtomicBoolean result = (AtomicBoolean) param;
+            result.set(stream.isPushSupported());
+            break;
+        }
         case PUSH_REQUEST: {
             try {
                 PushToken pushToken = (PushToken) param;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to