Browse Source

HttpHeaders.writeableHttpHeaders should unwrap many times

Prior to this commit, the `HttpHeaders.writeableHttpHeaders` would only
consider headers read-only instances that were wrapped once by
`HttpHeaders.readOnlyHttpHeaders`. This does not work when other
`HttpHeaders` wrappers are involved in the chain.

This commit ensures that `writeableHttpHeaders` unwraps all headers
instances down to the actual multivalue map and create a new headers
instance out of it.

Fixes gh-33789
pull/33850/head
Brian Clozel 1 year ago
parent
commit
a06bbccf9e
  1. 5
      spring-web/src/main/java/org/springframework/http/HttpHeaders.java
  2. 8
      spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java

5
spring-web/src/main/java/org/springframework/http/HttpHeaders.java

@ -1872,7 +1872,10 @@ public class HttpHeaders implements MultiValueMap<String, String>, Serializable @@ -1872,7 +1872,10 @@ public class HttpHeaders implements MultiValueMap<String, String>, 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);
}
/**

8
spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java

@ -57,6 +57,14 @@ class HttpHeadersTests { @@ -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";

Loading…
Cancel
Save