diff --git a/okhttp-tests/src/test/java/com/squareup/okhttp/MediaTypeTest.java b/okhttp-tests/src/test/java/com/squareup/okhttp/MediaTypeTest.java index 45dd06a64..25805957a 100644 --- a/okhttp-tests/src/test/java/com/squareup/okhttp/MediaTypeTest.java +++ b/okhttp-tests/src/test/java/com/squareup/okhttp/MediaTypeTest.java @@ -107,6 +107,11 @@ public class MediaTypeTest { assertEquals("UTF-8", mediaType.charset().name()); } + @Test public void testDuplicatedCharsets() { + MediaType mediaType = MediaType.parse("text/plain; charset=utf-8; charset=UTF-8"); + assertEquals("UTF-8", mediaType.charset().name()); + } + @Test public void testMultipleCharsets() { try { MediaType.parse("text/plain; charset=utf-8; charset=utf-16"); diff --git a/okhttp/src/main/java/com/squareup/okhttp/MediaType.java b/okhttp/src/main/java/com/squareup/okhttp/MediaType.java index b0b7f45f5..4d2f1fcf4 100644 --- a/okhttp/src/main/java/com/squareup/okhttp/MediaType.java +++ b/okhttp/src/main/java/com/squareup/okhttp/MediaType.java @@ -61,10 +61,13 @@ public final class MediaType { String name = parameter.group(1); if (name == null || !name.equalsIgnoreCase("charset")) continue; - if (charset != null) throw new IllegalArgumentException("Multiple charsets: " + string); - charset = parameter.group(2) != null + String charsetParameter = parameter.group(2) != null ? parameter.group(2) // Value is a token. : parameter.group(3); // Value is a quoted string. + if (charset != null && !charsetParameter.equalsIgnoreCase(charset)) { + throw new IllegalArgumentException("Multiple different charsets: " + string); + } + charset = charsetParameter; } return new MediaType(string, type, subtype, charset);