You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2018/07/06 16:20:19 UTC

svn commit: r1835263 - in /tomcat/trunk: java/org/apache/tomcat/util/http/ResponseUtil.java test/org/apache/tomcat/util/http/TestResponseUtil.java

Author: markt
Date: Fri Jul  6 16:20:19 2018
New Revision: 1835263

URL: http://svn.apache.org/viewvc?rev=1835263&view=rev
Log:
Expand code for adding Vary header value to support all current potential uses in Tomcat code base.

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/http/ResponseUtil.java
    tomcat/trunk/test/org/apache/tomcat/util/http/TestResponseUtil.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/http/ResponseUtil.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/ResponseUtil.java?rev=1835263&r1=1835262&r2=1835263&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/http/ResponseUtil.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/http/ResponseUtil.java Fri Jul  6 16:20:19 2018
@@ -18,8 +18,11 @@ package org.apache.tomcat.util.http;
 
 import java.io.IOException;
 import java.io.StringReader;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Enumeration;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import javax.servlet.http.HttpServletResponse;
@@ -36,8 +39,19 @@ public class ResponseUtil {
     }
 
 
+    public static void addVaryFieldName(MimeHeaders headers, String name) {
+        addVaryFieldName(new HeaderAdapter(headers), name);
+    }
+
+
     public static void addVaryFieldName(HttpServletResponse response, String name) {
-        Collection<String> varyHeaders = response.getHeaders(VARY_HEADER);
+        addVaryFieldName(new ResponseAdapter(response), name);
+    }
+
+
+    private static void addVaryFieldName(Adapter adapter, String name) {
+
+        Collection<String> varyHeaders = adapter.getHeaders(VARY_HEADER);
 
         // Short-cut if only * has been set
         if (varyHeaders.size() == 1 && varyHeaders.iterator().next().trim().equals(VARY_ALL)) {
@@ -47,13 +61,13 @@ public class ResponseUtil {
 
         // Short-cut if no headers have been set
         if (varyHeaders.size() == 0) {
-            response.addHeader(VARY_HEADER, name);
+            adapter.addHeader(VARY_HEADER, name);
             return;
         }
 
         // Short-cut if "*" is added
         if (VARY_ALL.equals(name.trim())) {
-            response.setHeader(VARY_HEADER, VARY_ALL);
+            adapter.setHeader(VARY_HEADER, VARY_ALL);
             return;
         }
 
@@ -75,7 +89,7 @@ public class ResponseUtil {
 
         if (fieldNames.contains(VARY_ALL)) {
             // '*' has been added without removing other values. Optimise.
-            response.setHeader(VARY_HEADER, VARY_ALL);
+            adapter.setHeader(VARY_HEADER, VARY_ALL);
             return;
         }
 
@@ -88,6 +102,69 @@ public class ResponseUtil {
             varyHeader.append(',');
             varyHeader.append(fieldName);
         }
-        response.setHeader(VARY_HEADER, varyHeader.toString());
+        adapter.setHeader(VARY_HEADER, varyHeader.toString());
+    }
+
+
+    private static interface Adapter {
+
+        Collection<String> getHeaders(String name);
+
+        void setHeader(String name, String value);
+
+        void addHeader(String name, String value);
+    }
+
+
+    private static final class HeaderAdapter implements Adapter {
+        private final MimeHeaders headers;
+
+        public HeaderAdapter(MimeHeaders headers) {
+            this.headers = headers;
+        }
+
+        @Override
+        public Collection<String> getHeaders(String name) {
+            Enumeration<String> values = headers.values(name);
+            List<String> result = new ArrayList<>();
+            while (values.hasMoreElements()) {
+                result.add(values.nextElement());
+            }
+            return result;
+        }
+
+        @Override
+        public void setHeader(String name, String value) {
+            headers.setValue(name).setString(value);
+        }
+
+        @Override
+        public void addHeader(String name, String value) {
+            headers.addValue(name).setString(value);
+        }
+    }
+
+
+    private static final class ResponseAdapter implements Adapter {
+        private final HttpServletResponse response;
+
+        public ResponseAdapter(HttpServletResponse response) {
+            this.response = response;
+        }
+
+        @Override
+        public Collection<String> getHeaders(String name) {
+            return response.getHeaders(name);
+        }
+
+        @Override
+        public void setHeader(String name, String value) {
+            response.setHeader(name, value);
+        }
+
+        @Override
+        public void addHeader(String name, String value) {
+            response.addHeader(name, value);
+        }
     }
 }

Modified: tomcat/trunk/test/org/apache/tomcat/util/http/TestResponseUtil.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/TestResponseUtil.java?rev=1835263&r1=1835262&r2=1835263&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/http/TestResponseUtil.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/util/http/TestResponseUtil.java Fri Jul  6 16:20:19 2018
@@ -179,4 +179,39 @@ public class TestResponseUtil {
         }
         Assert.assertEquals(expected, result);
     }
+
+
+    @Test
+    public void testMimeHeadersAddAllWithNone() {
+        MimeHeaders mh = new MimeHeaders();
+        Set<String> expected = new HashSet<>();
+        expected.add("*");
+        doTestAddVaryFieldName(mh, "*", expected);
+    }
+
+
+    @Test
+    public void testMimeHeadersAddValidWithValidHeaders() {
+        MimeHeaders mh = new MimeHeaders();
+        mh.addValue("vary").setString("foo");
+        mh.addValue("vary").setString("bar");
+        Set<String> expected = new HashSet<>();
+        expected.add("bar");
+        expected.add("foo");
+        expected.add("too");
+        doTestAddVaryFieldName(mh, "too", expected);
+    }
+
+    private void doTestAddVaryFieldName(MimeHeaders mh, String fieldName,
+            Set<String> expected) {
+        ResponseUtil.addVaryFieldName(mh, fieldName);
+        // There will now only be one Vary header
+        String resultHeader = mh.getHeader("vary");
+        Set<String> result = new HashSet<>();
+        // Deliberately do not use Vary.parseVary as it will skip invalid values.
+        for (String value : resultHeader.split(",")) {
+            result.add(value.trim());
+        }
+        Assert.assertEquals(expected, result);
+    }
 }



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