From 4ca27db0ccc35b31ac7a9fdfd66a9a6fd91d13ca Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 26 Mar 2019 16:32:02 +0100 Subject: [PATCH] Copy cookies to ServerResponse builders See gh-22351 --- .../function/DefaultEntityResponseBuilder.java | 4 ++-- .../function/DefaultRenderingResponseBuilder.java | 4 ++-- .../function/DefaultServerResponseBuilder.java | 12 ++++++++---- .../web/servlet/function/EntityResponse.java | 11 +++++++---- .../web/servlet/function/RenderingResponse.java | 11 +++++++---- .../function/DefaultEntityResponseBuilderTests.java | 4 +++- .../function/DefaultRenderingResponseTests.java | 4 +++- 7 files changed, 32 insertions(+), 18 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java index 7005e39fba0..2c06431eb0a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilder.java @@ -126,8 +126,8 @@ final class DefaultEntityResponseBuilder implements EntityResponse.Builder } @Override - public EntityResponse.Builder headers(HttpHeaders headers) { - this.headers.putAll(headers); + public EntityResponse.Builder headers(Consumer headersConsumer) { + headersConsumer.accept(this.headers); return this; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultRenderingResponseBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultRenderingResponseBuilder.java index 42040b6aefc..e4f34fdfe8b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultRenderingResponseBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultRenderingResponseBuilder.java @@ -138,8 +138,8 @@ final class DefaultRenderingResponseBuilder implements RenderingResponse.Builder } @Override - public RenderingResponse.Builder headers(HttpHeaders headers) { - this.headers.putAll(headers); + public RenderingResponse.Builder headers(Consumer headersConsumer) { + headersConsumer.accept(this.headers); return this; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerResponseBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerResponseBuilder.java index 11fdf1b0944..590a130296f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerResponseBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/DefaultServerResponseBuilder.java @@ -189,24 +189,27 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { @Override public ServerResponse body(Object body) { return DefaultEntityResponseBuilder.fromObject(body) - .headers(this.headers) .status(this.statusCode) + .headers(headers -> headers.putAll(this.headers)) + .cookies(cookies -> cookies.addAll(this.cookies)) .build(); } @Override public ServerResponse body(T body, ParameterizedTypeReference bodyType) { return DefaultEntityResponseBuilder.fromObject(body, bodyType) - .headers(this.headers) .status(this.statusCode) + .headers(headers -> headers.putAll(this.headers)) + .cookies(cookies -> cookies.addAll(this.cookies)) .build(); } @Override public ServerResponse render(String name, Object... modelAttributes) { return new DefaultRenderingResponseBuilder(name) - .headers(this.headers) .status(this.statusCode) + .headers(headers -> headers.putAll(this.headers)) + .cookies(cookies -> cookies.addAll(this.cookies)) .modelAttributes(modelAttributes) .build(); } @@ -214,8 +217,9 @@ class DefaultServerResponseBuilder implements ServerResponse.BodyBuilder { @Override public ServerResponse render(String name, Map model) { return new DefaultRenderingResponseBuilder(name) - .headers(this.headers) .status(this.statusCode) + .headers(headers -> headers.putAll(this.headers)) + .cookies(cookies -> cookies.addAll(this.cookies)) .modelAttributes(model) .build(); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/EntityResponse.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/EntityResponse.java index 7cdeea0c85f..9b53012dca8 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/EntityResponse.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/EntityResponse.java @@ -86,12 +86,15 @@ public interface EntityResponse extends ServerResponse { Builder header(String headerName, String... headerValues); /** - * Copy the given headers into the entity's headers map. - * @param headers the existing HttpHeaders to copy from + * Manipulate this response's headers with the given consumer. The + * headers provided to the consumer are "live", so that the consumer can be used to + * {@linkplain HttpHeaders#set(String, String) overwrite} existing header values, + * {@linkplain HttpHeaders#remove(Object) remove} values, or use any of the other + * {@link HttpHeaders} methods. + * @param headersConsumer a function that consumes the {@code HttpHeaders} * @return this builder - * @see HttpHeaders#add(String, String) */ - Builder headers(HttpHeaders headers); + Builder headers(Consumer headersConsumer); /** * Set the HTTP status. diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/RenderingResponse.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/RenderingResponse.java index 876699e740a..aa8bd51565f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/RenderingResponse.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/RenderingResponse.java @@ -119,12 +119,15 @@ public interface RenderingResponse extends ServerResponse { Builder header(String headerName, String... headerValues); /** - * Copy the given headers into the entity's headers map. - * @param headers the existing HttpHeaders to copy from + * Manipulate this response's headers with the given consumer. The + * headers provided to the consumer are "live", so that the consumer can be used to + * {@linkplain HttpHeaders#set(String, String) overwrite} existing header values, + * {@linkplain HttpHeaders#remove(Object) remove} values, or use any of the other + * {@link HttpHeaders} methods. + * @param headersConsumer a function that consumes the {@code HttpHeaders} * @return this builder - * @see HttpHeaders#add(String, String) */ - Builder headers(HttpHeaders headers); + Builder headers(Consumer headersConsumer); /** * Set the HTTP status. diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilderTests.java index 73a787181f2..26c357202a9 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultEntityResponseBuilderTests.java @@ -154,7 +154,9 @@ public class DefaultEntityResponseBuilderTests { String body = "foo"; HttpHeaders headers = new HttpHeaders(); headers.set("foo", "bar"); - EntityResponse result = EntityResponse.fromObject(body).headers(headers).build(); + EntityResponse result = EntityResponse.fromObject(body) + .headers(h -> h.addAll(headers)) + .build(); assertEquals(headers, result.headers()); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultRenderingResponseTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultRenderingResponseTests.java index 8176b44731f..93c3d38f4e3 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultRenderingResponseTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/DefaultRenderingResponseTests.java @@ -78,7 +78,9 @@ public class DefaultRenderingResponseTests { public void headers() throws Exception { HttpHeaders headers = new HttpHeaders(); headers.set("foo", "bar"); - RenderingResponse result = RenderingResponse.create("foo").headers(headers).build(); + RenderingResponse result = RenderingResponse.create("foo") + .headers(h -> h.addAll(headers)) + .build(); MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletResponse response = new MockHttpServletResponse();