Browse Source

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
pull/130/merge
Rossen Stoyanchev 13 years ago
parent
commit
2e1a68893d
  1. 10
      spring-web/src/main/java/org/springframework/http/HttpHeaders.java
  2. 10
      spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java

10
spring-web/src/main/java/org/springframework/http/HttpHeaders.java

@ -153,7 +153,15 @@ public class HttpHeaders implements MultiValueMap<String, String>, Serializable @@ -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;
}
/**

10
spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java

@ -55,6 +55,16 @@ public class HttpHeadersTests { @@ -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");

Loading…
Cancel
Save