diff --git a/spring-core/src/main/java/org/springframework/util/MimeType.java b/spring-core/src/main/java/org/springframework/util/MimeType.java index 1fea14ca60d..1aa4162470a 100644 --- a/spring-core/src/main/java/org/springframework/util/MimeType.java +++ b/spring-core/src/main/java/org/springframework/util/MimeType.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -103,6 +103,9 @@ public class MimeType implements Comparable, Serializable { private final Map parameters; + @Nullable + private Charset resolvedCharset; + @Nullable private volatile String toStringValue; @@ -138,6 +141,7 @@ public class MimeType implements Comparable, Serializable { */ public MimeType(String type, String subtype, Charset charset) { this(type, subtype, Collections.singletonMap(PARAM_CHARSET, charset.name())); + this.resolvedCharset = charset; } /** @@ -150,6 +154,7 @@ public class MimeType implements Comparable, Serializable { */ public MimeType(MimeType other, Charset charset) { this(other.getType(), other.getSubtype(), addCharsetParameter(charset, other.getParameters())); + this.resolvedCharset = charset; } /** @@ -197,7 +202,7 @@ public class MimeType implements Comparable, Serializable { * @see HTTP 1.1, section 2.2 */ private void checkToken(String token) { - for (int i = 0; i < token.length(); i++ ) { + for (int i = 0; i < token.length(); i++) { char ch = token.charAt(i); if (!TOKEN.get(ch)) { throw new IllegalArgumentException("Invalid token character '" + ch + "' in token \"" + token + "\""); @@ -210,8 +215,9 @@ public class MimeType implements Comparable, Serializable { Assert.hasLength(value, "'value' must not be empty"); checkToken(attribute); if (PARAM_CHARSET.equals(attribute)) { - value = unquote(value); - Charset.forName(value); + if (this.resolvedCharset == null) { + this.resolvedCharset = Charset.forName(unquote(value)); + } } else if (!isQuotedString(value)) { checkToken(value); @@ -279,8 +285,7 @@ public class MimeType implements Comparable, Serializable { */ @Nullable public Charset getCharset() { - String charset = getParameter(PARAM_CHARSET); - return (charset != null ? Charset.forName(unquote(charset)) : null); + return this.resolvedCharset; } /**