diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java index feed71a5e03..2ebda5fbd88 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java @@ -681,7 +681,12 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override public void setHeader(String name, @Nullable String value) { - setHeaderValue(name, value); + if (value == null) { + this.headers.remove(name); + } + else { + setHeaderValue(name, value); + } } @Override diff --git a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java index 7c066fef0bd..131e0696673 100644 --- a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java +++ b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java @@ -88,6 +88,18 @@ class MockHttpServletResponseTests { assertThat(response.containsHeader(headerName)).isFalse(); } + @ParameterizedTest + @ValueSource(strings = { + CONTENT_TYPE, + CONTENT_LANGUAGE, + "X-Test-Header" + }) + void removeHeaderIfNullValue(String headerName) { + response.addHeader(headerName, "test"); + response.setHeader(headerName, null); + assertThat(response.containsHeader(headerName)).isFalse(); + } + @Test // gh-26493 void setLocaleWithNullValue() { assertThat(response.getLocale()).isEqualTo(Locale.getDefault()); diff --git a/spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java b/spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java index b8511a8f8d2..f1d5e2bfa61 100644 --- a/spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java +++ b/spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java @@ -161,7 +161,13 @@ public class ContentCachingResponseWrapper extends HttpServletResponseWrapper { @Override public void setHeader(String name, String value) { 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 { super.setHeader(name, value); diff --git a/spring-web/src/test/java/org/springframework/web/filter/ContentCachingResponseWrapperTests.java b/spring-web/src/test/java/org/springframework/web/filter/ContentCachingResponseWrapperTests.java index 25ddffbc3b6..5fd7a300c9f 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/ContentCachingResponseWrapperTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/ContentCachingResponseWrapperTests.java @@ -270,6 +270,17 @@ class ContentCachingResponseWrapperTests { .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) { assertHeader(response, header, Integer.toString(value)); diff --git a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java index fe31513e9c5..f4c20df40ab 100644 --- a/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java +++ b/spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java @@ -681,7 +681,12 @@ public class MockHttpServletResponse implements HttpServletResponse { @Override public void setHeader(String name, @Nullable String value) { - setHeaderValue(name, value); + if (value == null) { + this.headers.remove(name); + } + else { + setHeaderValue(name, value); + } } @Override