From ccf4b028d2900b19690220ff7e4724ef61d823c0 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Fri, 21 Feb 2025 14:33:03 +0100 Subject: [PATCH] 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 --- .../web/util/ContentCachingResponseWrapper.java | 8 +++++++- .../filter/ContentCachingResponseWrapperTests.java | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) 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 41fc196d678..f3596993daa 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 @@ -164,7 +164,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));