Browse Source

Ignore empty entries when parsing MediaTypes and MimeTypes

Prior to Spring Framework 5.1.3, MimeTypeUtils.parseMimeTypes() and
MediaType.parseMediaTypes() ignored empty entries, but 5.1.3 introduced
a regression in that an empty entry -- for example, due to a trailing
comma in the list of media types in an HTTP Accept header -- would result
in a "406 Not Acceptable" response status.

This commit fixes this by filtering out empty entries before parsing
them into MimeType and MediaType instances. Empty entries are therefore
effectively ignored.

Fixes gh-23241
pull/23837/head
Sam Brannen 7 years ago
parent
commit
efab6eb55d
  1. 6
      spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java
  2. 7
      spring-core/src/test/java/org/springframework/util/MimeTypeTests.java
  3. 7
      spring-web/src/main/java/org/springframework/http/MediaType.java
  4. 7
      spring-web/src/test/java/org/springframework/http/MediaTypeTests.java

6
spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java

@ -38,6 +38,7 @@ import org.springframework.lang.Nullable; @@ -38,6 +38,7 @@ import org.springframework.lang.Nullable;
* @author Arjen Poutsma
* @author Rossen Stoyanchev
* @author Dimitrios Liapis
* @author Sam Brannen
* @since 4.0
*/
public abstract class MimeTypeUtils {
@ -259,10 +260,11 @@ public abstract class MimeTypeUtils { @@ -259,10 +260,11 @@ public abstract class MimeTypeUtils {
return Collections.emptyList();
}
return tokenize(mimeTypes).stream()
.map(MimeTypeUtils::parseMimeType).collect(Collectors.toList());
.filter(StringUtils::hasText)
.map(MimeTypeUtils::parseMimeType)
.collect(Collectors.toList());
}
/**
* Tokenize the given comma-separated string of {@code MimeType} objects
* into a {@code List<String>}. Unlike simple tokenization by ",", this

7
spring-core/src/test/java/org/springframework/util/MimeTypeTests.java

@ -277,6 +277,13 @@ public class MimeTypeTests { @@ -277,6 +277,13 @@ public class MimeTypeTests {
assertEquals("Invalid amount of mime types", 0, mimeTypes.size());
}
@Test // gh-23241
public void parseMimeTypesWithTrailingComma() {
List<MimeType> mimeTypes = MimeTypeUtils.parseMimeTypes("text/plain, text/html,");
assertNotNull("No mime types returned", mimeTypes);
assertEquals("Incorrect number of mime types", 2, mimeTypes.size());
}
@Test // SPR-17459
public void parseMimeTypesWithQuotedParameters() {
testWithQuotedParameters("foo/bar;param=\",\"");

7
spring-web/src/main/java/org/springframework/http/MediaType.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 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.
@ -44,6 +44,7 @@ import org.springframework.util.StringUtils; @@ -44,6 +44,7 @@ import org.springframework.util.StringUtils;
* @author Rossen Stoyanchev
* @author Sebastien Deleuze
* @author Kazuki Shimizu
* @author Sam Brannen
* @since 3.0
* @see <a href="https://tools.ietf.org/html/rfc7231#section-3.1.1.1">
* HTTP 1.1: Semantics and Content, section 3.1.1.1</a>
@ -553,7 +554,9 @@ public class MediaType extends MimeType implements Serializable { @@ -553,7 +554,9 @@ public class MediaType extends MimeType implements Serializable {
return Collections.emptyList();
}
return MimeTypeUtils.tokenize(mediaTypes).stream()
.map(MediaType::parseMediaType).collect(Collectors.toList());
.filter(StringUtils::hasText)
.map(MediaType::parseMediaType)
.collect(Collectors.toList());
}
/**

7
spring-web/src/test/java/org/springframework/http/MediaTypeTests.java

@ -143,6 +143,13 @@ public class MediaTypeTests { @@ -143,6 +143,13 @@ public class MediaTypeTests {
assertEquals("Invalid amount of media types", 0, mediaTypes.size());
}
@Test // gh-23241
public void parseMediaTypesWithTrailingComma() {
List<MediaType> mediaTypes = MediaType.parseMediaTypes("text/plain, text/html, ");
assertNotNull("No media types returned", mediaTypes);
assertEquals("Incorrect number of media types", 2, mediaTypes.size());
}
@Test
public void compareTo() {
MediaType audioBasic = new MediaType("audio", "basic");

Loading…
Cancel
Save