Author: markt
Date: Thu Oct 15 20:30:47 2015
New Revision: 1708887

URL: http://svn.apache.org/viewvc?rev=1708887&view=rev
Log:
Servlet 4.0
Complete the implementation for the creation of the PushBuilder.
Work still required on the generation of the push request.

Modified:
    tomcat/trunk/java/javax/servlet/http/PushBuilder.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java

Modified: tomcat/trunk/java/javax/servlet/http/PushBuilder.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/PushBuilder.java?rev=1708887&r1=1708886&r2=1708887&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/PushBuilder.java (original)
+++ tomcat/trunk/java/javax/servlet/http/PushBuilder.java Thu Oct 15 20:30:47 
2015
@@ -28,6 +28,15 @@ import java.util.Set;
  *     {@link #path(String)}.</li>
  * <li>Conditional, range, expectation, authorization and referer headers will
  *     be removed.</li>
+ * <li>Cookies added to the associated response will be added to the push
+ *     request unless maxAge <= 0 in which case any request cookie with the 
same
+ *     name will be removed.</li>
+ * <li>The referer header will be set to
+ *     {@link HttpServletRequest#getRequestURL()} plus, if present, the query
+ *     string from {@link HttpServletRequest#getQueryString()}.
+ * <li>If either of the headers @code If-Modified-Since} or
+ *     {@code If-None-Match} were present then {@link #isConditional()} will be
+ *     set to {@code true}.
  * </ul>
  *
  * @since Servlet 4.0

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=1708887&r1=1708886&r2=1708887&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationPushBuilder.java Thu 
Oct 15 20:30:47 2015
@@ -21,6 +21,7 @@ import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -28,11 +29,13 @@ 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;
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.PushBuilder;
 
 import org.apache.catalina.connector.Request;
+import org.apache.catalina.util.SessionConfig;
 import org.apache.coyote.ActionCode;
 import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.collections.CaseInsensitiveKeyMap;
@@ -43,19 +46,24 @@ public class ApplicationPushBuilder impl
     private static final StringManager sm = 
StringManager.getManager(ApplicationPushBuilder.class);
 
     private final HttpServletRequest baseRequest;
+    private final Request catalinaRequest;
     private final org.apache.coyote.Request coyoteRequest;
+    private final String sessionCookieName;
+    private final String sessionPathParameterName;
+    private final boolean addSessionCookie;
+    private final boolean addSessionPathParameter;
 
+    private final Map<String,List<String>> headers = new 
CaseInsensitiveKeyMap<>();
+    private final List<Cookie> cookies = new ArrayList<>();
     private String method = "GET";
-    private Map<String,List<String>> headers = new CaseInsensitiveKeyMap<>();
     private String path;
     private String etag;
     private String lastModified;
     private String queryString;
     private String sessionId;
-    private boolean addSessionCookie;
-    private boolean addSessionPathParameter;
     private boolean conditional;
 
+
     public ApplicationPushBuilder(HttpServletRequest request) {
         baseRequest = request;
         // Need a reference to the CoyoteRequest in order to process the push
@@ -64,7 +72,8 @@ public class ApplicationPushBuilder impl
             current = ((ServletRequestWrapper) current).getRequest();
         }
         if (current instanceof Request) {
-            coyoteRequest = ((Request) current).getCoyoteRequest();
+            catalinaRequest = ((Request) current);
+            coyoteRequest = catalinaRequest.getCoyoteRequest();
         } else {
             throw new UnsupportedOperationException(sm.getString(
                     "applicationPushBuilder.noCoyoteRequest", 
current.getClass().getName()));
@@ -84,14 +93,34 @@ public class ApplicationPushBuilder impl
 
         // Remove the headers
         headers.remove("if-match");
-        headers.remove("if-none-match");
-        headers.remove("if-modified-since");
+        if (headers.remove("if-none-match") != null) {
+            conditional = true;
+        }
+        if (headers.remove("if-modified-since") != null) {
+            conditional = true;
+        }
         headers.remove("if-unmodified-since");
         headers.remove("if-range");
         headers.remove("range");
         headers.remove("expect");
         headers.remove("authorization");
         headers.remove("referer");
+        // Also remove the cookie header since it will be regenerated
+        headers.remove("cookie");
+
+        // set the referer header
+        StringBuffer referer = request.getRequestURL();
+        if (request.getQueryString() != null) {
+            referer.append('?');
+            referer.append(request.getQueryString());
+
+        }
+        addHeader("referer", referer.toString());
+
+        // Session
+        ApplicationContext appContext = (ApplicationContext) 
request.getServletContext();
+        sessionCookieName = 
SessionConfig.getSessionCookieName(appContext.getContext());
+        sessionPathParameterName = 
SessionConfig.getSessionUriParamName(appContext.getContext());
 
         HttpSession session = request.getSession(false);
         if (session != null) {
@@ -100,13 +129,35 @@ public class ApplicationPushBuilder impl
         if (sessionId == null) {
             sessionId = request.getRequestedSessionId();
         }
-        addSessionCookie = request.isRequestedSessionIdFromCookie();
-        addSessionPathParameter = request.isRequestedSessionIdFromURL();
-        if (!addSessionCookie && !addSessionPathParameter && sessionId != 
null) {
+        if (!request.isRequestedSessionIdFromCookie() && 
!request.isRequestedSessionIdFromURL() &&
+                sessionId != null) {
             Set<SessionTrackingMode> sessionTrackingModes =
                     
request.getServletContext().getEffectiveSessionTrackingModes();
             addSessionCookie = 
sessionTrackingModes.contains(SessionTrackingMode.COOKIE);
             addSessionPathParameter = 
sessionTrackingModes.contains(SessionTrackingMode.URL);
+        } else {
+            addSessionCookie = request.isRequestedSessionIdFromCookie();
+            addSessionPathParameter = request.isRequestedSessionIdFromURL();
+        }
+
+        // Cookies
+        for (Cookie requestCookie : request.getCookies()) {
+            cookies.add(requestCookie);
+        }
+        for (Cookie responseCookie : 
catalinaRequest.getResponse().getCookies()) {
+            if (responseCookie.getMaxAge() < 0) {
+                // Path information not available so can only remove based on
+                // name.
+                Iterator<Cookie> cookieIterator = cookies.iterator();
+                while (cookieIterator.hasNext()) {
+                    Cookie cookie = cookieIterator.next();
+                    if (cookie.getName().equals(responseCookie.getName())) {
+                        cookieIterator.remove();
+                    }
+                }
+            } else {
+                cookies.add(new Cookie(responseCookie.getName(), 
responseCookie.getValue()));
+            }
         }
     }
 
@@ -302,11 +353,11 @@ public class ApplicationPushBuilder impl
         // Session ID (do this before setting the path since it may change it)
         if (sessionId != null) {
             if (addSessionPathParameter) {
-                // TODO: Update pushPath for client's benefit
-                // TODO: Figure out how to get this into the CoyoteRequest
+                pushPath = pushPath + ";" + sessionPathParameterName + "=" + 
sessionId;
+                pushTarget.addPathParameter(sessionPathParameterName, 
sessionId);
             }
             if (addSessionCookie) {
-                // TODO: add this
+                cookies.add(new Cookie(sessionCookieName, sessionId));
             }
         }
 
@@ -327,6 +378,9 @@ public class ApplicationPushBuilder impl
             // TODO conditional
         }
 
+        // Cookies
+        // TODO
+
         coyoteRequest.action(ActionCode.PUSH_REQUEST, pushTarget);
 
         // Reset for next call to this method



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

Reply via email to