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 716218e544c..ac6f55fe760 100644 --- a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java +++ b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java @@ -44,6 +44,7 @@ import org.springframework.lang.Nullable; * @author Rossen Stoyanchev * @author Dimitrios Liapis * @author Brian Clozel + * @author Sam Brannen * @since 4.0 */ public abstract class MimeTypeUtils { @@ -273,10 +274,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}. Unlike simple tokenization by ",", this 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 2431991ea3b..ad1890651ab 100644 --- a/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java +++ b/spring-core/src/test/java/org/springframework/util/MimeTypeTests.java @@ -303,6 +303,13 @@ public class MimeTypeTests { assertThat(mimeTypes.size()).as("Invalid amount of mime types").isEqualTo(0); } + @Test // gh-23241 + public void parseMimeTypesWithTrailingComma() { + List mimeTypes = MimeTypeUtils.parseMimeTypes("text/plain, text/html,"); + assertThat(mimeTypes).as("No mime types returned").isNotNull(); + assertThat(mimeTypes.size()).as("Incorrect number of mime types").isEqualTo(2); + } + @Test // SPR-17459 public void parseMimeTypesWithQuotedParameters() { testWithQuotedParameters("foo/bar;param=\",\""); diff --git a/spring-web/src/main/java/org/springframework/http/MediaType.java b/spring-web/src/main/java/org/springframework/http/MediaType.java index ad37e198510..08b2991a8de 100644 --- a/spring-web/src/main/java/org/springframework/http/MediaType.java +++ b/spring-web/src/main/java/org/springframework/http/MediaType.java @@ -596,7 +596,9 @@ public class MediaType extends MimeType implements Serializable { List tokenizedTypes = MimeTypeUtils.tokenize(mediaTypes); List result = new ArrayList<>(tokenizedTypes.size()); for (String type : tokenizedTypes) { - result.add(parseMediaType(type)); + if (StringUtils.hasText(type)) { + result.add(parseMediaType(type)); + } } return result; } diff --git a/spring-web/src/test/java/org/springframework/http/MediaTypeTests.java b/spring-web/src/test/java/org/springframework/http/MediaTypeTests.java index c136df22526..83885f6124a 100644 --- a/spring-web/src/test/java/org/springframework/http/MediaTypeTests.java +++ b/spring-web/src/test/java/org/springframework/http/MediaTypeTests.java @@ -35,6 +35,7 @@ import static org.assertj.core.api.Assertions.within; /** * @author Arjen Poutsma * @author Juergen Hoeller + * @author Sam Brannen */ public class MediaTypeTests { @@ -159,6 +160,13 @@ public class MediaTypeTests { assertThat(mediaTypes.size()).as("Invalid amount of media types").isEqualTo(0); } + @Test // gh-23241 + public void parseMediaTypesWithTrailingComma() { + List mediaTypes = MediaType.parseMediaTypes("text/plain, text/html, "); + assertThat(mediaTypes).as("No media types returned").isNotNull(); + assertThat(mediaTypes.size()).as("Incorrect number of media types").isEqualTo(2); + } + @Test public void compareTo() { MediaType audioBasic = new MediaType("audio", "basic");