From 2e1a68893dc6d28a3fc6169eed075ce837c153b4 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Mon, 22 Oct 2012 16:09:33 -0400 Subject: [PATCH] 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 --- .../java/org/springframework/http/HttpHeaders.java | 10 +++++++++- .../org/springframework/http/HttpHeadersTests.java | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index 052c1f3408..3da6afe333 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -153,7 +153,15 @@ public class HttpHeaders implements MultiValueMap, Serializable */ public List getAccept() { String value = getFirst(ACCEPT); - return (value != null ? MediaType.parseMediaTypes(value) : Collections.emptyList()); + List result = (value != null) ? MediaType.parseMediaTypes(value) : Collections.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; } /** diff --git a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java index 1b82eeb8d6..2b6ef1035f 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -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 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");