You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2006/09/13 20:02:49 UTC
svn commit: r443047 - in /incubator/abdera/java/trunk:
client/src/main/java/org/apache/abdera/protocol/client/
protocol/src/main/java/org/apache/abdera/protocol/
protocol/src/main/java/org/apache/abdera/protocol/util/
server/src/main/java/org/apache/ab...
Author: jmsnell
Date: Wed Sep 13 11:02:48 2006
New Revision: 443047
URL: http://svn.apache.org/viewvc?view=rev&rev=443047
Log:
Per APP Draft -10,
Clients MAY send non-ASCII characters in the Slug entity-header,
which they MUST encode using "encoded-words", as defined in
[RFC2047]. Servers SHOULD treat the slug as [RFC2047] encoded if it
matches the "encoded-words" production.
Add a method that allows the charset to be specified when setting the Slug header.
request.setSlug("foo", "utf-8");
Modified request.getSlug() so that it always attempts to decode, just in case the value
is RFC2047-encoded.
Add methods for allowing any header to be encoded/decoded
Added:
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/EncodingUtil.java
Modified:
incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java
incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java
incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/AbstractResponseContext.java
Modified: incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java?view=diff&rev=443047&r1=443046&r2=443047
==============================================================================
--- incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java (original)
+++ incubator/abdera/java/trunk/client/src/main/java/org/apache/abdera/protocol/client/RequestOptions.java Wed Sep 13 11:02:48 2006
@@ -29,6 +29,7 @@
import org.apache.abdera.protocol.Request;
import org.apache.abdera.protocol.util.AbstractRequest;
import org.apache.abdera.protocol.util.CacheControlUtil;
+import org.apache.abdera.protocol.util.EncodingUtil;
import org.apache.commons.httpclient.util.DateParseException;
import org.apache.commons.httpclient.util.DateUtil;
@@ -116,6 +117,22 @@
setHeader("Authorization", auth);
}
+ public void setEncodedHeader(String header, String charset, String value) {
+ setHeader(header, EncodingUtil.encode(value,charset));
+ }
+
+ public void setEncodedHeader(String header, String charset, String... values) {
+ if (values != null && values.length > 0) {
+ for (int n = 0; n < values.length; n++) {
+ values[n] = EncodingUtil.encode(values[n], charset);
+ }
+ List<String> list = Arrays.asList(new String[] {combine(values)});
+ getHeaders().put(header, list);
+ } else {
+ removeHeaders(header);
+ }
+ }
+
public void setHeader(String header, String value) {
if (value != null)
setHeader(header, new String[] {value});
@@ -138,6 +155,25 @@
removeHeaders(header);
}
+ public void addEncodedHeader(String header, String charset, String value) {
+ addHeader(header, EncodingUtil.encode(value, charset));
+ }
+
+ public void addEncodedHeader(String header, String charset, String... values) {
+ if (values == null || values.length == 0) return;
+ for (int n = 0; n < values.length; n++) {
+ values[n] = EncodingUtil.encode(values[n], charset);
+ }
+ List<String> list = getHeaders().get(header);
+ String value = combine(values);
+ if (list != null) {
+ if (!list.contains(value))
+ list.add(value);
+ } else {
+ setHeader(header, new String[] {value});
+ }
+ }
+
public void addHeader(String header, String value) {
if (value != null)
addHeader(header, new String[] {value});
@@ -241,6 +277,10 @@
public void setSlug(String slug) {
setHeader("Slug", slug);
+ }
+
+ public void setSlug(String slug, String charset) {
+ setEncodedHeader("Slug", charset, slug);
}
public void setCacheControl(String cc) {
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java?view=diff&rev=443047&r1=443046&r2=443047
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/Request.java Wed Sep 13 11:02:48 2006
@@ -29,7 +29,11 @@
String getHeader(String name);
+ String getDecodedHeader(String name);
+
List<String> getHeaders(String name);
+
+ List<String> getDecodedHeaders(String name);
String[] getHeaderNames();
Modified: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java?view=diff&rev=443047&r1=443046&r2=443047
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java (original)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/AbstractRequest.java Wed Sep 13 11:02:48 2006
@@ -18,6 +18,7 @@
package org.apache.abdera.protocol.util;
import java.util.Date;
+import java.util.List;
import javax.activation.MimeType;
import javax.activation.MimeTypeParseException;
@@ -56,7 +57,7 @@
}
public String getSlug() {
- return getHeader("Slug");
+ return EncodingUtil.decode(getHeader("Slug"));
}
public MimeType getContentType() throws MimeTypeParseException {
@@ -143,5 +144,18 @@
public void setOnlyIfCached(boolean val) {
toggle(val, ONLYIFCACHED);
+ }
+
+ public String getDecodedHeader(String header) {
+ return EncodingUtil.decode(getHeader(header));
+ }
+
+ public List<String> getDecodedHeaders(String header) {
+ List<String> headers = getHeaders(header);
+ String[] vals = new String[headers.size()];
+ for (int n = 0; n < headers.size(); n++) {
+ vals[n] = EncodingUtil.decode(headers.get(n));
+ }
+ return java.util.Arrays.asList(vals);
}
}
Added: incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/EncodingUtil.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/EncodingUtil.java?view=auto&rev=443047
==============================================================================
--- incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/EncodingUtil.java (added)
+++ incubator/abdera/java/trunk/protocol/src/main/java/org/apache/abdera/protocol/util/EncodingUtil.java Wed Sep 13 11:02:48 2006
@@ -0,0 +1,39 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License. For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.protocol.util;
+
+import org.apache.commons.codec.net.QCodec;
+
+public class EncodingUtil {
+
+ public static String encode(String value, String charset) {
+ try {
+ return (new QCodec(charset)).encode(value);
+ } catch (Exception e) {
+ return value;
+ }
+ }
+
+ public static String decode(String value) {
+ try {
+ return (new QCodec()).decode(value);
+ } catch (Exception e) {
+ return value;
+ }
+ }
+}
Modified: incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/AbstractResponseContext.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/AbstractResponseContext.java?view=diff&rev=443047&r1=443046&r2=443047
==============================================================================
--- incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/AbstractResponseContext.java (original)
+++ incubator/abdera/java/trunk/server/src/main/java/org/apache/abdera/protocol/server/provider/AbstractResponseContext.java Wed Sep 13 11:02:48 2006
@@ -26,6 +26,7 @@
import org.apache.abdera.protocol.EntityTag;
import org.apache.abdera.protocol.server.provider.ResponseContext;
import org.apache.abdera.protocol.util.AbstractResponse;
+import org.apache.abdera.protocol.util.EncodingUtil;
public abstract class AbstractResponseContext
extends AbstractResponse
@@ -43,6 +44,19 @@
headers.remove(name);
}
+ public void setEncodedHeader(String name, String charset, String value) {
+ setHeader(name, EncodingUtil.encode(value, charset));
+ }
+
+ public void setEncodedHeader(String name, String charset, String... vals) {
+ Map<String,List<Object>> headers = getHeaders();
+ List<Object> values = new ArrayList<Object>();
+ for (String value : vals) {
+ values.add(EncodingUtil.encode(value, charset));
+ }
+ headers.put(name, values);
+ }
+
public void setHeader(String name, Object value) {
Map<String,List<Object>> headers = getHeaders();
List<Object> values = new ArrayList<Object>();
@@ -59,6 +73,22 @@
headers.put(name, values);
}
+ public void addEncodedHeader(String name, String charset, String value) {
+ addHeader(name, EncodingUtil.encode(value, charset));
+ }
+
+ public void addEncodedHeaders(String name, String charset, String... vals) {
+ Map<String,List<Object>> headers = getHeaders();
+ List<Object> values = new ArrayList<Object>();
+ if (values == null) {
+ values = new ArrayList<Object>();
+ headers.put(name,values);
+ }
+ for (String value : vals) {
+ values.add(EncodingUtil.encode(value, charset));
+ }
+ }
+
public void addHeader(String name, Object value) {
Map<String,List<Object>> headers = getHeaders();
List<Object> values = new ArrayList<Object>();
@@ -179,6 +209,10 @@
return;
}
setHeader("Content-Location", uri);
+ }
+
+ public void setSlug(String slug, String charset) {
+ setSlug(EncodingUtil.encode(slug, charset));
}
public void setSlug(String slug) {