From 2a5713f389e305300d7659887d38a89aa4e7e91e Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Mon, 29 Nov 2021 16:48:36 +0100 Subject: [PATCH] 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 --- .../server/DefaultServerResponseBuilder.java | 4 +--- .../DefaultServerResponseBuilderTests.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java index da71fbe565a..2d406d39d46 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java @@ -362,9 +362,7 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { private static void copy(MultiValueMap src, MultiValueMap dst) { if (!src.isEmpty()) { - src.entrySet().stream() - .filter(entry -> !dst.containsKey(entry.getKey())) - .forEach(entry -> dst.put(entry.getKey(), entry.getValue())); + dst.putAll(src); } } } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilderTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilderTests.java index 38b295463ca..c3780d2c443 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilderTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilderTests.java @@ -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() {