diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java index d30f5dcae7..3e50f3d448 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpUtil.java @@ -394,10 +394,15 @@ public final class HttpUtil { */ public static Charset getCharset(CharSequence contentTypeValue, Charset defaultCharset) { if (contentTypeValue != null) { - CharSequence charsetCharSequence = getCharsetAsSequence(contentTypeValue); - if (charsetCharSequence != null) { + CharSequence charsetRaw = getCharsetAsSequence(contentTypeValue); + if (charsetRaw != null) { + if (charsetRaw.length() > 2) { // at least contains 2 quotes(") + if (charsetRaw.charAt(0) == '"' && charsetRaw.charAt(charsetRaw.length() - 1) == '"') { + charsetRaw = charsetRaw.subSequence(1, charsetRaw.length() - 1); + } + } try { - return Charset.forName(charsetCharSequence.toString()); + return Charset.forName(charsetRaw.toString()); } catch (IllegalCharsetNameException ignored) { // just return the default charset } catch (UnsupportedCharsetException ignored) { diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/HttpUtilTest.java b/codec-http/src/test/java/io/netty/handler/codec/http/HttpUtilTest.java index 799a31a51d..6b05fa53e5 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/HttpUtilTest.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/HttpUtilTest.java @@ -76,19 +76,66 @@ public class HttpUtilTest { @Test public void testGetCharset() { - String NORMAL_CONTENT_TYPE = "text/html; charset=utf-8"; - String UPPER_CASE_NORMAL_CONTENT_TYPE = "TEXT/HTML; CHARSET=UTF-8"; + testGetCharsetUtf8("text/html; charset=utf-8"); + } + + @Test + public void testGetCharsetNoSpace() { + testGetCharsetUtf8("text/html;charset=utf-8"); + } + + @Test + public void testGetCharsetQuoted() { + testGetCharsetUtf8("text/html; charset=\"utf-8\""); + } + + @Test + public void testGetCharsetNoSpaceQuoted() { + testGetCharsetUtf8("text/html;charset=\"utf-8\""); + } + + private void testGetCharsetUtf8(String contentType) { + String UPPER_CASE_NORMAL_CONTENT_TYPE = contentType.toUpperCase(); HttpMessage message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); - message.headers().set(HttpHeaderNames.CONTENT_TYPE, NORMAL_CONTENT_TYPE); + message.headers().set(HttpHeaderNames.CONTENT_TYPE, contentType); assertEquals(CharsetUtil.UTF_8, HttpUtil.getCharset(message)); - assertEquals(CharsetUtil.UTF_8, HttpUtil.getCharset(NORMAL_CONTENT_TYPE)); + assertEquals(CharsetUtil.UTF_8, HttpUtil.getCharset(contentType)); message.headers().set(HttpHeaderNames.CONTENT_TYPE, UPPER_CASE_NORMAL_CONTENT_TYPE); assertEquals(CharsetUtil.UTF_8, HttpUtil.getCharset(message)); assertEquals(CharsetUtil.UTF_8, HttpUtil.getCharset(UPPER_CASE_NORMAL_CONTENT_TYPE)); } + @Test + public void testGetCharsetNoLeadingQuotes() { + testGetCharsetInvalidQuotes("text/html;charset=utf-8\""); + } + + @Test + public void testGetCharsetNoTrailingQuotes() { + testGetCharsetInvalidQuotes("text/html;charset=\"utf-8"); + } + + @Test + public void testGetCharsetOnlyQuotes() { + testGetCharsetInvalidQuotes("text/html;charset=\"\""); + } + + private static void testGetCharsetInvalidQuotes(String contentType) { + String UPPER_CASE_NORMAL_CONTENT_TYPE = contentType.toUpperCase(); + + HttpMessage message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); + message.headers().set(HttpHeaderNames.CONTENT_TYPE, contentType); + assertEquals(CharsetUtil.ISO_8859_1, HttpUtil.getCharset(message, CharsetUtil.ISO_8859_1)); + assertEquals(CharsetUtil.ISO_8859_1, HttpUtil.getCharset(contentType, CharsetUtil.ISO_8859_1)); + + message.headers().set(HttpHeaderNames.CONTENT_TYPE, UPPER_CASE_NORMAL_CONTENT_TYPE); + assertEquals(CharsetUtil.ISO_8859_1, HttpUtil.getCharset(message, CharsetUtil.ISO_8859_1)); + assertEquals(CharsetUtil.ISO_8859_1, HttpUtil.getCharset(UPPER_CASE_NORMAL_CONTENT_TYPE, + CharsetUtil.ISO_8859_1)); + } + @Test public void testGetCharsetIfNotLastParameter() { String NORMAL_CONTENT_TYPE_WITH_PARAMETERS = "application/soap-xml; charset=utf-8; "