diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index 5e742ee9f99..0c7e1d42607 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -1872,7 +1872,10 @@ public class HttpHeaders implements MultiValueMap, Serializable if (headers == EMPTY) { return new HttpHeaders(); } - return (headers instanceof ReadOnlyHttpHeaders ? new HttpHeaders(headers.headers) : headers); + while (headers.headers instanceof HttpHeaders wrapped) { + headers = wrapped; + } + return new HttpHeaders(headers.headers); } /** diff --git a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java index 80d62a344ac..5725b0b4324 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -57,6 +57,14 @@ class HttpHeadersTests { private final HttpHeaders headers = new HttpHeaders(); + @Test + void writableHttpHeadersUnwrapsMultiple() { + HttpHeaders originalExchangeHeaders = HttpHeaders.readOnlyHttpHeaders(new HttpHeaders()); + HttpHeaders firewallHeaders = new HttpHeaders(originalExchangeHeaders); + HttpHeaders writeable = HttpHeaders.writableHttpHeaders(firewallHeaders); + writeable.setContentType(MediaType.APPLICATION_JSON); + } + @Test void getOrEmpty() { String key = "FOO";