Browse Source

Handle null values in MockHttpServletResponse#setHeader

Prior to this commit, `MockHttpServletResponse#setHeader` would not
remove the header entry when given a `null` value, as documented in the
Servlet API.
This commit ensures that this behavior is enforced.

Fixes gh-34466
6.1.x
Brian Clozel 11 months ago
parent
commit
b5c89c91a9
  1. 7
      spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java
  2. 12
      spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java
  3. 7
      spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java

7
spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java

@ -671,7 +671,12 @@ public class MockHttpServletResponse implements HttpServletResponse { @@ -671,7 +671,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

12
spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java

@ -87,6 +87,18 @@ class MockHttpServletResponseTests { @@ -87,6 +87,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());

7
spring-web/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java

@ -671,7 +671,12 @@ public class MockHttpServletResponse implements HttpServletResponse { @@ -671,7 +671,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

Loading…
Cancel
Save