Repository: cxf Updated Branches: refs/heads/3.0.x-fixes fa4ae6a45 -> f29db4a71
[CXF-7320] Unwrapping a charset if needed Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/f29db4a7 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/f29db4a7 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/f29db4a7 Branch: refs/heads/3.0.x-fixes Commit: f29db4a717731915290ac3193d8d55cf11feb002 Parents: fa4ae6a Author: Sergey Beryozkin <sberyoz...@gmail.com> Authored: Fri Apr 28 16:38:48 2017 +0100 Committer: Sergey Beryozkin <sberyoz...@gmail.com> Committed: Fri Apr 28 16:46:38 2017 +0100 ---------------------------------------------------------------------- .../org/apache/cxf/jaxrs/utils/HttpUtils.java | 18 ++++++++++++++---- .../org/apache/cxf/jaxrs/utils/HttpUtilsTest.java | 17 +++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/f29db4a7/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java index fed0204..1c4459d 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java @@ -80,7 +80,8 @@ public final class HttpUtils { private static final Pattern ENCODE_PATTERN = Pattern.compile("%[0-9a-fA-F][0-9a-fA-F]"); private static final String CHARSET_PARAMETER = "charset"; - + private static final String DOUBLE_QUOTE = "\""; + // there are more of such characters, ex, '*' but '*' is not affected by UrlEncode private static final String PATH_RESERVED_CHARACTERS = "=@/:!$&\'(),;~"; private static final String QUERY_RESERVED_CHARACTERS = "?/,"; @@ -544,7 +545,7 @@ public final class HttpUtils { public static String getSetEncoding(MediaType mt, MultivaluedMap<String, Object> headers, String defaultEncoding) { - String enc = mt.getParameters().get(CHARSET_PARAMETER); + String enc = getMediaTypeCharsetParameter(mt); if (enc == null) { return defaultEncoding; } @@ -564,10 +565,19 @@ public final class HttpUtils { } public static String getEncoding(MediaType mt, String defaultEncoding) { - String charset = mt == null ? defaultEncoding : mt.getParameters().get("charset"); + String charset = mt == null ? defaultEncoding : getMediaTypeCharsetParameter(mt); return charset == null ? defaultEncoding : charset; } - + + public static String getMediaTypeCharsetParameter(MediaType mt) { + String charset = mt.getParameters().get(CHARSET_PARAMETER); + if (charset != null && charset.startsWith(DOUBLE_QUOTE) + && charset.endsWith(DOUBLE_QUOTE) && charset.length() > 1) { + charset = charset.substring(1, charset.length() - 1); + } + return charset; + } + public static URI resolve(UriBuilder baseBuilder, URI uri) { if (!uri.isAbsolute()) { return baseBuilder.build().resolve(uri); http://git-wip-us.apache.org/repos/asf/cxf/blob/f29db4a7/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/HttpUtilsTest.java ---------------------------------------------------------------------- diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/HttpUtilsTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/HttpUtilsTest.java index a6de9db..2dbcace 100644 --- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/HttpUtilsTest.java +++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/HttpUtilsTest.java @@ -23,6 +23,7 @@ import java.net.URI; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.model.ParameterType; @@ -84,6 +85,22 @@ public class HttpUtilsTest extends Assert { } @Test + public void testMediaTypeWithUTF8() { + assertEquals("UTF-8", + HttpUtils.getEncoding(MediaType.valueOf("application/json;charset=UTF-8"), "UTF-16")); + } + @Test + public void testMediaTypeWithUTF8WithQuotes() { + assertEquals("UTF-8", + HttpUtils.getEncoding(MediaType.valueOf("application/json;charset=\"UTF-8\""), "UTF-16")); + } + @Test + public void testMediaTypeWithNoCharset() { + assertEquals("UTF-16", + HttpUtils.getEncoding(MediaType.valueOf("application/json"), "UTF-16")); + } + + @Test public void testIsDateHeader() { assertFalse(HttpUtils.isDateRelatedHeader(HttpHeaders.ETAG)); assertTrue(HttpUtils.isDateRelatedHeader(HttpHeaders.EXPIRES));