Update HttpHeaders.getAccept method

Some servlet containers (iPlanet) parse the Accept header and return
multiple values from request.getHeader("Accept"). The HttpHeaders
getAccept method has been updated to accommodate that hopefully
without causing any other issues.

The extra functionality is in effect only if we find only one
MediaType and there is more than one value for the 'Accept' header.

Issue: SPR-9655
This commit is contained in:
Rossen Stoyanchev 2012-10-22 16:09:33 -04:00
parent ae2d24808c
commit 2e1a68893d
2 changed files with 19 additions and 1 deletions

View File

@ -153,7 +153,15 @@ public class HttpHeaders implements MultiValueMap<String, String>, Serializable
*/
public List<MediaType> getAccept() {
String value = getFirst(ACCEPT);
return (value != null ? MediaType.parseMediaTypes(value) : Collections.<MediaType>emptyList());
List<MediaType> result = (value != null) ? MediaType.parseMediaTypes(value) : Collections.<MediaType>emptyList();
// Some containers parse 'Accept' into multiple values
if ((result.size() == 1) && (headers.get(ACCEPT).size() > 1)) {
value = StringUtils.collectionToCommaDelimitedString(headers.get(ACCEPT));
result = MediaType.parseMediaTypes(value);
}
return result;
}
/**

View File

@ -55,6 +55,16 @@ public class HttpHeadersTests {
assertEquals("Invalid Accept header", "text/html, text/plain", headers.getFirst("Accept"));
}
// SPR-9655
@Test
public void acceptiPlanet() {
headers.add("Accept", "text/html");
headers.add("Accept", "text/plain");
List<MediaType> expected = Arrays.asList(new MediaType("text", "html"), new MediaType("text", "plain"));
assertEquals("Invalid Accept header", expected, headers.getAccept());
}
@Test
public void acceptCharsets() {
Charset charset1 = Charset.forName("UTF-8");