Always copy ServerResponse headers

Prior to this commit, ServerResponse headers would only be written if
there were no existing headers with the same name, thus making it
impossible to overwrite existing headers.

With the changes in this commit, headers are always written.

Closes gh-27741
This commit is contained in:
Arjen Poutsma 2021-11-29 16:48:36 +01:00
parent 40d2058b97
commit 2a5713f389
2 changed files with 18 additions and 3 deletions

View File

@ -362,9 +362,7 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder {
private static <K,V> void copy(MultiValueMap<K,V> src, MultiValueMap<K,V> dst) {
if (!src.isEmpty()) {
src.entrySet().stream()
.filter(entry -> !dst.containsKey(entry.getKey()))
.forEach(entry -> dst.put(entry.getKey(), entry.getValue()));
dst.putAll(src);
}
}
}

View File

@ -320,6 +320,23 @@ public class DefaultServerResponseBuilderTests {
assertThat(serverResponse.block().cookies().isEmpty()).isFalse();
}
@Test
public void overwriteHeaders() {
ServerResponse serverResponse =
ServerResponse.ok().headers(headers -> headers.set("Foo", "Bar")).build().block();
assertThat(serverResponse).isNotNull();
MockServerWebExchange mockExchange = MockServerWebExchange
.builder(MockServerHttpRequest.get("https://example.org"))
.build();
MockServerHttpResponse response = mockExchange.getResponse();
response.getHeaders().set("Foo", "Baz");
serverResponse.writeTo(mockExchange, EMPTY_CONTEXT).block();
assertThat(response.getHeaders().getFirst("Foo")).isEqualTo("Bar");
}
@Test
public void build() {