SPR-8867 Fix issue with Content-Length header and UTF-8 charset.
The AbstractHttpMessageConverter was using the requested Content-Type rather than the actual response Content-Type to determine the length of the content. This can lead to a problem when a controller returns a ResponseEntity with a Content-Type header that ignores (overrides) the requested Content-Type. The fix ensures that actual response Content-Type is the one used both to write to the response and to determine the length of the content.
This commit is contained in:
parent
aa7fcb5431
commit
a9a068e678
|
@ -23,10 +23,11 @@ Changes in version 3.1 RC2 (2011-11-15)
|
|||
* added ignoreDefaultModelOnRedirect attribute to <mvc:annotation-driven/>
|
||||
* added methods to UriComponentsBuilder for replacing the path or the query
|
||||
* added ServletUriComponentsBuilder to build a UriComponents instance starting with a ServletRequest
|
||||
* support UriComponentsBuilder as @Controller method argument
|
||||
* added support for UriComponentsBuilder as @Controller method argument
|
||||
* MockHttpServletRequest and MockHttpServletResponse now keep contentType field and Content-Type header in sync
|
||||
* fixed issue with cache ignoring prototype-scoped controllers in RequestMappingHandlerAdapter
|
||||
* update Spring MVC configuration section to include MVC Java config and the MVC namespace
|
||||
* updated Spring MVC configuration section to include MVC Java config and the MVC namespace
|
||||
* fixed issue with setting Content-Length header depending on the charset of the response
|
||||
|
||||
Changes in version 3.1 RC1 (2011-10-11)
|
||||
---------------------------------------
|
||||
|
|
|
@ -173,7 +173,7 @@ public abstract class AbstractHttpMessageConverter<T> implements HttpMessageConv
|
|||
}
|
||||
}
|
||||
if (headers.getContentLength() == -1) {
|
||||
Long contentLength = getContentLength(t, contentType);
|
||||
Long contentLength = getContentLength(t, headers.getContentType());
|
||||
if (contentLength != null) {
|
||||
headers.setContentLength(contentLength);
|
||||
}
|
||||
|
|
|
@ -85,4 +85,22 @@ public class StringHttpMessageConverterTests {
|
|||
outputMessage.getHeaders().getContentLength());
|
||||
assertFalse("Invalid accept-charset", outputMessage.getHeaders().getAcceptCharset().isEmpty());
|
||||
}
|
||||
|
||||
// SPR-8867
|
||||
|
||||
@Test
|
||||
public void writeOverrideRequestedContentType() throws IOException {
|
||||
Charset utf8 = Charset.forName("UTF-8");
|
||||
MediaType requestedContentType = new MediaType("text", "html");
|
||||
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
|
||||
MediaType contentType = new MediaType("text", "plain", utf8);
|
||||
outputMessage.getHeaders().setContentType(contentType);
|
||||
String body = "H\u00e9llo W\u00f6rld";
|
||||
converter.write(body, requestedContentType, outputMessage);
|
||||
assertEquals("Invalid result", body, outputMessage.getBodyAsString(utf8));
|
||||
assertEquals("Invalid content-type", contentType, outputMessage.getHeaders().getContentType());
|
||||
assertEquals("Invalid content-length", body.getBytes(utf8).length,
|
||||
outputMessage.getHeaders().getContentLength());
|
||||
assertFalse("Invalid accept-charset", outputMessage.getHeaders().getAcceptCharset().isEmpty());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue