diff --git a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java index b97877970c42..6b99b5bc13f5 100644 --- a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java +++ b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java @@ -23,8 +23,8 @@ import java.util.Collection; import java.util.Collections; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Random; import java.util.function.BiPredicate; @@ -437,7 +437,9 @@ private void resolveBareType(String candidate) { private void putParameter(String name, String value) { if (this.parameters == null) { - this.parameters = new LinkedHashMap<>(4); + // Parameter names are case-insensitive, so use a case-insensitive + // map in order to reject duplicates that differ only in case. + this.parameters = new LinkedCaseInsensitiveMap<>(4, Locale.ROOT); } if (this.parameters.put(name, value) != null) { throw new InvalidMimeTypeException(this.input, "duplicate parameter '" + name + "=" + value + "'"); diff --git a/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java b/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java index bef9ebfde422..fa4327520f03 100644 --- a/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java +++ b/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java @@ -174,6 +174,12 @@ void valueOfDuplicateParameter() { .hasMessageContaining("Invalid mime type \"text/plain;dupe=\"1\";dupe=\"2\"\": duplicate parameter 'dupe=\"2\"'"); } + @Test + void valueOfDuplicateParameterWithDifferentCase() { + assertThatThrownBy(() -> MimeType.valueOf("text/plain;dupe=\"1\";DUPE=\"2\"")).isInstanceOf(InvalidMimeTypeException.class) + .hasMessageContaining("Invalid mime type \"text/plain;dupe=\"1\";DUPE=\"2\"\": duplicate parameter 'DUPE=\"2\"'"); + } + }