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());
}
}