You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/05/20 12:08:49 UTC
svn commit: r1484414 -
/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java
Author: sergeyb
Date: Mon May 20 10:08:48 2013
New Revision: 1484414
URL: http://svn.apache.org/r1484414
Log:
[CXF-5024] Updating Headers utitly to deal with Date, Locale, Link, etc
Modified:
cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java
Modified: cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java?rev=1484414&r1=1484413&r2=1484414&view=diff
==============================================================================
--- cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java (original)
+++ cxf/trunk/rt/transports/http/src/main/java/org/apache/cxf/transport/http/Headers.java Mon May 20 10:08:48 2013
@@ -28,10 +28,12 @@ import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Set;
import java.util.TimeZone;
import java.util.TreeMap;
import java.util.logging.Level;
@@ -55,11 +57,29 @@ public class Headers {
* is used to get the response.
*/
public static final String KEY_HTTP_CONNECTION = "http.connection";
- public static final String PROTOCOL_HEADERS_CONTENT_TYPE = Message.CONTENT_TYPE.toLowerCase();
+ /**
+ * Each header value is added as a separate HTTP header, example, given A header with 'a' and 'b'
+ * values, two A headers will be added as opposed to a single A header with the "a,b" value.
+ */
public static final String ADD_HEADERS_PROPERTY = "org.apache.cxf.http.add-headers";
+
+ public static final String PROTOCOL_HEADERS_CONTENT_TYPE = Message.CONTENT_TYPE.toLowerCase();
public static final String HTTP_HEADERS_SETCOOKIE = "Set-Cookie";
+ public static final String HTTP_HEADERS_LINK = "Link";
private static final Logger LOG = LogUtils.getL7dLogger(Headers.class);
+
+ /**
+ * Known HTTP headers whose values have to be represented as individual HTTP headers
+ */
+ private static final Set<String> HTTP_HEADERS_SINGLE_VALUE_ONLY;
+
+ static {
+ HTTP_HEADERS_SINGLE_VALUE_ONLY = new HashSet<String>();
+ HTTP_HEADERS_SINGLE_VALUE_ONLY.add(HTTP_HEADERS_SETCOOKIE);
+ HTTP_HEADERS_SINGLE_VALUE_ONLY.add(HTTP_HEADERS_LINK);
+ }
+
private final Message message;
private final Map<String, List<String>> headers;
@@ -412,18 +432,15 @@ public class Headers {
String header = (String)iter.next();
List<?> headerList = headers.get(header);
- if (addHeaders || HTTP_HEADERS_SETCOOKIE.equals(header)) {
+ if (addHeaders || HTTP_HEADERS_SINGLE_VALUE_ONLY.contains(header)) {
for (int i = 0; i < headerList.size(); i++) {
- response.addHeader(header, headerList.get(i).toString());
+ response.addHeader(header, headerObjectToString(headerList.get(i)));
}
} else {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < headerList.size(); i++) {
- Object headerValue = headerList.get(i);
- if (headerValue instanceof Date) {
- headerValue = toHttpDate((Date)headerValue);
- }
- sb.append(headerValue.toString());
+ sb.append(headerObjectToString(headerList.get(i)));
+
if (i + 1 < headerList.size()) {
sb.append(',');
}
@@ -435,6 +452,28 @@ public class Headers {
}
}
+ private String headerObjectToString(Object headerObject) {
+ if (headerObject.getClass() == String.class) {
+ // Most likely
+ return headerObject.toString();
+ } else {
+ // We may consider introducing CXF HeaderDelegate interface
+ // so that the below code may be pushed back to the JAX-RS
+ // front-end where non String header objects are more likely
+ // to be set. Though the below code may be generally useful
+
+ String headerString;
+ if (headerObject instanceof Date) {
+ headerString = toHttpDate((Date)headerObject);
+ } else if (headerObject instanceof Locale) {
+ headerString = toHttpLanguage((Locale)headerObject);
+ } else {
+ headerString = headerObject.toString();
+ }
+ return headerString;
+ }
+ }
+
void removeContentType() {
if (headers.containsKey(PROTOCOL_HEADERS_CONTENT_TYPE)) {
headers.remove(PROTOCOL_HEADERS_CONTENT_TYPE);
@@ -462,4 +501,14 @@ public class Headers {
SimpleDateFormat format = getHttpDateFormat();
return format.format(date);
}
+
+ public static String toHttpLanguage(Locale locale) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(locale.getLanguage());
+ if (locale.getCountry() != null) {
+ // Locale.toString() will add "_" instead, '-' is typically expected
+ sb.append('-').append(locale.getCountry());
+ }
+ return sb.toString();
+ }
}