Browse Source

Fix null value support in ContentCachingResponseWrapper

Prior to this commit, calling `setHeader` on the response wrapper would
have a separate code path for the "Content-Length" header. This did not
support calls with `null` values and would result in an exception.

This commit ensures that the cached content length value is reset in
this case and that the call is forwarded properly to the superclass.

Fixes gh-34465
6.1.x
Brian Clozel 10 months ago
parent
commit
ccf4b028d2
  1. 8
      spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java
  2. 11
      spring-web/src/test/java/org/springframework/web/filter/ContentCachingResponseWrapperTests.java

8
spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java

@ -164,7 +164,13 @@ public class ContentCachingResponseWrapper extends HttpServletResponseWrapper {
@Override @Override
public void setHeader(String name, String value) { public void setHeader(String name, String value) {
if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) { if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) {
this.contentLength = toContentLengthInt(Long.parseLong(value)); if (value != null) {
this.contentLength = toContentLengthInt(Long.parseLong(value));
}
else {
this.contentLength = null;
super.setHeader(name, null);
}
} }
else { else {
super.setHeader(name, value); super.setHeader(name, value);

11
spring-web/src/test/java/org/springframework/web/filter/ContentCachingResponseWrapperTests.java

@ -270,6 +270,17 @@ class ContentCachingResponseWrapperTests {
.withMessageContaining(overflow); .withMessageContaining(overflow);
} }
@Test
void setContentLengthNull() {
MockHttpServletResponse response = new MockHttpServletResponse();
ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
responseWrapper.setContentLength(1024);
responseWrapper.setHeader(CONTENT_LENGTH, null);
assertThat(response.getHeaderNames()).doesNotContain(CONTENT_LENGTH);
assertThat(responseWrapper.getHeader(CONTENT_LENGTH)).isNull();
}
private void assertHeader(HttpServletResponse response, String header, int value) { private void assertHeader(HttpServletResponse response, String header, int value) {
assertHeader(response, header, Integer.toString(value)); assertHeader(response, header, Integer.toString(value));

Loading…
Cancel
Save