Browse Source

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
pull/27832/head
Arjen Poutsma 4 years ago
parent
commit
2a5713f389
  1. 4
      spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java
  2. 17
      spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilderTests.java

4
spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilder.java

@ -362,9 +362,7 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { @@ -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);
}
}
}

17
spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerResponseBuilderTests.java

@ -320,6 +320,23 @@ public class DefaultServerResponseBuilderTests { @@ -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() {

Loading…
Cancel
Save