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 1b9b668ba0d..24add7f4f3d 100644 --- a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java +++ b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java @@ -238,7 +238,7 @@ public abstract class MimeTypeUtils { break; } } - else if (ch == '"') { + else if (ch == '"' && mimeType.charAt(nextIndex - 1) != '\\') { quoted = !quoted; } nextIndex++; 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 b1998ca0795..6346b8ec540 100644 --- a/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java +++ b/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java @@ -98,7 +98,7 @@ class MimeTypeTests { } @Test - void parseQuotedSeparator() { + void parseQuotedParameterValue() { String s = "application/xop+xml;charset=utf-8;type=\"application/soap+xml;action=\\\"https://x.y.z\\\"\""; MimeType mimeType = MimeType.valueOf(s); assertThat(mimeType.getType()).as("Invalid type").isEqualTo("application"); @@ -107,6 +107,15 @@ class MimeTypeTests { assertThat(mimeType.getParameter("type")).isEqualTo("\"application/soap+xml;action=\\\"https://x.y.z\\\"\""); } + @Test + void parseParameterWithQuotedPair() { + String s = "text/plain;twelve=\"1\\\"2\""; + MimeType mimeType = MimeType.valueOf(s); + assertThat(mimeType.getType()).as("Invalid type").isEqualTo("text"); + assertThat(mimeType.getSubtype()).as("Invalid subtype").isEqualTo("plain"); + assertThat(mimeType.getParameter("twelve")).isEqualTo("\"1\\\"2\""); + } + @Test void withConversionService() { ConversionService conversionService = new DefaultConversionService();