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 c7c7cafcc5..99c3b170ad 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -436,8 +436,11 @@ public class HttpHeaders implements MultiValueMap, Serializable if (headers == EMPTY) { this.headers = CollectionUtils.toMultiValueMap(new LinkedCaseInsensitiveMap<>(8, Locale.ENGLISH)); } - else if (headers instanceof ReadOnlyHttpHeaders readOnlyHttpHeaders) { - this.headers = readOnlyHttpHeaders.headers; + else if (headers instanceof HttpHeaders httpHeaders) { + while (httpHeaders.headers instanceof HttpHeaders wrapped) { + httpHeaders = wrapped; + } + this.headers = httpHeaders.headers; } else { this.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 1341fc2fad..7abbd6c633 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -69,6 +69,14 @@ class HttpHeadersTests { assertThat(writable.getContentType()).isEqualTo(MediaType.TEXT_PLAIN); } + @Test + void writableHttpHeadersUnwrapsMultiple() { + HttpHeaders originalExchangeHeaders = HttpHeaders.readOnlyHttpHeaders(new HttpHeaders()); + HttpHeaders firewallHeaders = new HttpHeaders(originalExchangeHeaders); + HttpHeaders writeable = new HttpHeaders(firewallHeaders); + writeable.setContentType(MediaType.APPLICATION_JSON); + } + @Test void getOrEmpty() { String key = "FOO";