Author: pete
Date: Thu Jun 30 18:03:52 2011
New Revision: 1141642

URL: http://svn.apache.org/viewvc?rev=1141642&view=rev
Log:
WICKET-3845 support custom response headers in AbstractResource.ResourceResponse

Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
    
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HeaderCollection.java
    
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HeadersCollectionTest.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java?rev=1141642&r1=1141641&r2=1141642&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
 Thu Jun 30 18:03:52 2011
@@ -423,7 +423,7 @@ public abstract class AbstractResource i
                }
 
                /**
-                * set a response header
+                * add a response header value
                 * 
                 * you can only set header values that or not already modified 
by
                 * the other methods of this class like 'Content-Length', 
'Last-Modified', etc.
@@ -433,13 +433,13 @@ public abstract class AbstractResource i
                 * @param value
                 *          header value
                 */
-               public void setHeader(String name, String value)
+               public void addHeader(String name, String value)
                {
                        // check if header can be directly access
                        checkHeaderAccess(name);
                        
                        //set header value
-                       headers.setHeader(name, value);
+                       headers.addHeader(name, value);
                }
 
                /**
@@ -448,18 +448,19 @@ public abstract class AbstractResource i
                 * you can only get header values that or not already handled by
                 * the other methods of this class like 'Content-Length', 
'Last-Modified', etc.
                 *  
+                *
                 * @param name
                 *          header name
                 *          
-                * @return header value or <code>null</code> if not found
+                * @return array of header values
                 */
-               public String getHeader(final String name)
+               public String[] getHeaderValues(final String name)
                {
                        // check if header can be directly access
                        checkHeaderAccess(name);
 
                        // get header value
-                       return headers.getValue(name);
+                       return headers.getValues(name);
                }
 
                /**
@@ -477,7 +478,7 @@ public abstract class AbstractResource i
                        checkHeaderAccess(name);
 
                        // remove header value
-                       headers.removeHeader(name);
+                       headers.removeHeaderValues(name);
                }
 
                /**
@@ -630,7 +631,10 @@ public abstract class AbstractResource i
                        // set additional response headers
                        for (HeaderCollection.Entry entry : data.headers)
                        {
-                               webResponse.setHeader(entry.getName(), 
entry.getValue());
+                               for (String value : entry.getValues())
+                               {
+                                       webResponse.setHeader(entry.getName(), 
value);
+                               }
                        }
 
                        // 6. Flush the response

Modified: 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HeaderCollection.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HeaderCollection.java?rev=1141642&r1=1141641&r2=1141642&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HeaderCollection.java
 (original)
+++ 
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/HeaderCollection.java
 Thu Jun 30 18:03:52 2011
@@ -16,14 +16,16 @@
  */
 package org.apache.wicket.request;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.wicket.util.lang.Args;
 
 /**
- * a collection of headers with name and value suitable for 
+ * a multivalue map of headers names and header values suitable for 
  * processing request and response headers.
  *
  * @author Peter Ertl
@@ -32,50 +34,54 @@ import org.apache.wicket.util.lang.Args;
  */
 public class HeaderCollection implements Iterable<HeaderCollection.Entry>
 {
-       private final Map<String, String> headers;
+       private static final String[] NO_VALUES = new String[0];
+
+       private final Map<String, List<String>> headers;
 
        public HeaderCollection()
        {
-               headers = new HashMap<String, String>();
+               headers = new HashMap<String, List<String>>();
        }
 
        /**
-        * set header value
+        * add header value
         *
         * @param name
         *          header name
         * @param value
         *          header value
         */
-       public void setHeader(String name, String value)
+       public void addHeader(String name, String value)
        {
                // be lenient and strip leading / trailing blanks
                name = Args.notEmpty(name, "name").trim();
                value = Args.notEmpty(value, "value").trim();
 
-               // remove previous value (required since headers are handled 
case-sensitive)
-               // for example adding 'Content-Type' will overwrite 
'content-type' 
-               removeHeader(name);
+               List<String> values = headers.get(name);
 
-               // add new value
-               headers.put(name, value);
+               if (values == null)
+               {
+                       values = new ArrayList<String>();
+                       headers.put(name, values);
+               }
+               values.add(value);
        }
 
        /**
-        * remove header value
+        * remove header values for header name
         *
         * @param name
         *          header name
         */
-       public void removeHeader(String name)
+       public void removeHeaderValues(String name)
        {
                name = Args.notEmpty(name, "name").trim();
 
-               final Iterator<Map.Entry<String, String>> it = 
headers.entrySet().iterator();
+               final Iterator<Map.Entry<String, List<String>>> it = 
headers.entrySet().iterator();
 
                while (it.hasNext())
                {
-                       Map.Entry<String, String> header = it.next();
+                       Map.Entry<String, List<String>> header = it.next();
 
                        if (header.getKey().equalsIgnoreCase(name))
                        {
@@ -85,26 +91,28 @@ public class HeaderCollection implements
        }
 
        /**
-        * get header value
+        * get header values
+        *
+        *
         *
         * @param name
         *          header name
         *
         * @return header value or <code>null</code> if not found
         */
-       public String getValue(String name)
+       public String[] getValues(String name)
        {
                Args.notEmpty(name, "name");
 
                // get the header value (case might differ)
-               for (Map.Entry<String, String> header : headers.entrySet())
+               for (Map.Entry<String, List<String>> header : 
headers.entrySet())
                {
                        if (header.getKey().equalsIgnoreCase(name))
                        {
-                               return header.getValue();
+                               return header.getValue().toArray(new 
String[header.getValue().size()]);
                        }
                }
-               return null;
+               return NO_VALUES;
        }
 
        /**
@@ -114,7 +122,7 @@ public class HeaderCollection implements
         */
        public Iterator<Entry> iterator()
        {
-               final Iterator<Map.Entry<String, String>> iterator = 
headers.entrySet().iterator();
+               final Iterator<Map.Entry<String,List<String>>> iterator = 
headers.entrySet().iterator();
 
                return new Iterator<Entry>()
                {
@@ -160,9 +168,9 @@ public class HeaderCollection implements
         */
        public static class Entry
        {
-               private final Map.Entry<String, String> header;
+               private final Map.Entry<String, List<String>> header;
 
-               public Entry(Map.Entry<String, String> header)
+               public Entry(Map.Entry<String, List<String>> header)
                {
                        this.header = header;
                }
@@ -172,9 +180,9 @@ public class HeaderCollection implements
                        return header.getKey();
                }
 
-               public String getValue()
+               public String[] getValues()
                {
-                       return header.getValue();
+                       return header.getValue().toArray(new 
String[header.getValue().size()]);
                }
        }
 }

Modified: 
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HeadersCollectionTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HeadersCollectionTest.java?rev=1141642&r1=1141641&r2=1141642&view=diff
==============================================================================
--- 
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HeadersCollectionTest.java
 (original)
+++ 
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/HeadersCollectionTest.java
 Thu Jun 30 18:03:52 2011
@@ -18,8 +18,7 @@ package org.apache.wicket.request;
 
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 public class HeadersCollectionTest
 {
@@ -28,23 +27,23 @@ public class HeadersCollectionTest
        {
                HeaderCollection headers = new HeaderCollection();
                assertTrue(headers.isEmpty());
-               
-               headers.setHeader("Content-Type", "text/html");
-               headers.setHeader("content-type", "text/plain");
-               assertEquals("text/plain", headers.getValue("CONTENT-TYPE"));
-               
-               headers.removeHeader("content-TYPE");
+
+               headers.addHeader("X-Test", "foo");
+               headers.addHeader("X-Test", "bar");
+               assertArrayEquals(new String[]{"foo", "bar"}, 
headers.getValues("X-Test"));
+
+               headers.removeHeaderValues("x-test");
                assertTrue(headers.isEmpty());
-               
-               headers.setHeader("   Content-Type    ", "    image/jpeg     ");
-               headers.setHeader("Content-TYPE    ", "    image/gif     ");
-               assertEquals("image/gif", headers.getValue("CONTENT-TYPE"));
+
+               headers.addHeader("   X-Image    ", "    jpeg     ");
+               headers.addHeader("X-Image    ", "    gif     ");
+               assertArrayEquals(new String[]{"jpeg", "gif"}, 
headers.getValues("X-IMAGE"));
                assertEquals(1, headers.getCount());
-               
-               headers.setHeader("X-Test", "123");
+
+               headers.addHeader("X-Test", "123");
                assertEquals(2, headers.getCount());
-               
-               headers.removeHeader("   content-TYPE");
+
+               headers.removeHeaderValues(" x-tesT ");
                assertEquals(1, headers.getCount());
        }
 }


Reply via email to