Refactor media types parsing improvements
Issue: SPR-17459
This commit is contained in:
@@ -44,7 +44,6 @@ import org.springframework.util.StringUtils;
|
||||
* @author Rossen Stoyanchev
|
||||
* @author Sebastien Deleuze
|
||||
* @author Kazuki Shimizu
|
||||
* @author Dimitrios Liapis
|
||||
* @since 3.0
|
||||
* @see <a href="http://tools.ietf.org/html/rfc7231#section-3.1.1.1">
|
||||
* HTTP 1.1: Semantics and Content, section 3.1.1.1</a>
|
||||
@@ -543,7 +542,7 @@ public class MediaType extends MimeType implements Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the given comma-separated string into a list of {@code MediaType} objects.
|
||||
* Parse the comma-separated string into a list of {@code MediaType} objects.
|
||||
* <p>This method can be used to parse an Accept or Content-Type header.
|
||||
* @param mediaTypes the string to parse
|
||||
* @return the list of media types
|
||||
@@ -553,24 +552,8 @@ public class MediaType extends MimeType implements Serializable {
|
||||
if (!StringUtils.hasLength(mediaTypes)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
boolean isQuoted = false;
|
||||
int nextBeginIndex = 0;
|
||||
List<MediaType> tokens = new ArrayList<>();
|
||||
for(int i = 0; i < mediaTypes.length() - 1; i++) {
|
||||
//tokenizing on commas that are not within double quotes
|
||||
if(mediaTypes.charAt(i) == ',' && !isQuoted) {
|
||||
tokens.add(parseMediaType(mediaTypes.substring(nextBeginIndex, i)));
|
||||
nextBeginIndex = i + 1;
|
||||
//ignoring escaped double quote within double quotes
|
||||
} else if(isQuoted && mediaTypes.charAt(i) == '"' && mediaTypes.charAt(i-1) == '\\') {
|
||||
continue;
|
||||
} else if(mediaTypes.charAt(i) == '"') {
|
||||
isQuoted = !isQuoted;
|
||||
}
|
||||
}
|
||||
//either the last part of the tokenization or the original string
|
||||
tokens.add(parseMediaType(mediaTypes.substring(nextBeginIndex)));
|
||||
return tokens;
|
||||
return MimeTypeUtils.tokenize(mediaTypes).stream()
|
||||
.map(MediaType::parseMediaType).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2016 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.
|
||||
@@ -32,7 +32,6 @@ import static org.junit.Assert.*;
|
||||
/**
|
||||
* @author Arjen Poutsma
|
||||
* @author Juergen Hoeller
|
||||
* @author Dimitrios Liapis
|
||||
*/
|
||||
public class MediaTypeTests {
|
||||
|
||||
@@ -144,56 +143,6 @@ public class MediaTypeTests {
|
||||
assertEquals("Invalid amount of media types", 0, mediaTypes.size());
|
||||
}
|
||||
|
||||
// SPR-17459
|
||||
@Test
|
||||
public void parseMediaTypesWithOddNumberOfDoubleQuotedCommas() {
|
||||
String s = "foo/bar;param=\",\"";
|
||||
List<MediaType> mediaTypes = MediaType.parseMediaTypes(s);
|
||||
assertEquals("Invalid amount of media types", 1, mediaTypes.size());
|
||||
assertEquals("Comma should be part of the media type", s, mediaTypes.get(0).toString());
|
||||
}
|
||||
|
||||
// SPR-17459
|
||||
@Test
|
||||
public void parseMediaTypesWithEvenNumberOfDoubleQuotedCommas() {
|
||||
String s = "foo/bar;param=\"s,a,\"";
|
||||
List<MediaType> mediaTypes = MediaType.parseMediaTypes(s);
|
||||
assertEquals("Invalid amount of media types", 1, mediaTypes.size());
|
||||
assertEquals("Comma should be part of the media type", s, mediaTypes.get(0).toString());
|
||||
}
|
||||
|
||||
// SPR-17459
|
||||
@Test
|
||||
public void parseMediaTypesWithAndWithoutDoubleQuotedCommas() {
|
||||
String s = "foo/bar;param=\"s,\", text/x-c";
|
||||
List<MediaType> mediaTypes = MediaType.parseMediaTypes(s);
|
||||
assertEquals("Invalid amount of media types", 2, mediaTypes.size());
|
||||
assertEquals("Comma should be part of the media type", "foo/bar;param=\"s,\"", mediaTypes.get(0).toString());
|
||||
}
|
||||
|
||||
// SPR-17459
|
||||
@Test
|
||||
public void parseMediaTypesIgnoreEscapedDoubleQuoteWithinDoubleQuotes() {
|
||||
String s = "foo/bar;param=\"a\\\"b,c\"";
|
||||
List<MediaType> mediaTypes = MediaType.parseMediaTypes(s);
|
||||
assertEquals("Invalid amount of media types", 1, mediaTypes.size());
|
||||
assertEquals("Escaped quote within quotes should be ignored when considering comma tokenization", s, mediaTypes.get(0).toString());
|
||||
}
|
||||
|
||||
// SPR-17459
|
||||
@Test
|
||||
public void parseMediaTypesIgnoreEscapedBackslash() {
|
||||
String s = "foo/bar;param=\"\\\\\"";
|
||||
List<MediaType> mediaTypes = MediaType.parseMediaTypes(s);
|
||||
assertEquals("Invalid amount of media types", 1, mediaTypes.size());
|
||||
assertEquals("Escaped quote within quotes should be ignored when considering comma tokenization", s, mediaTypes.get(0).toString());
|
||||
|
||||
s = "foo/bar;param=\"\\,\\\"";
|
||||
mediaTypes = MediaType.parseMediaTypes(s);
|
||||
assertEquals("Invalid amount of media types", 1, mediaTypes.size());
|
||||
assertEquals("Escaped quote within quotes should be ignored when considering comma tokenization", s, mediaTypes.get(0).toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void compareTo() {
|
||||
MediaType audioBasic = new MediaType("audio", "basic");
|
||||
|
||||
Reference in New Issue
Block a user