diff --git a/spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java b/spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java index d84214d8aa..fff798caf0 100644 --- a/spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java @@ -84,7 +84,7 @@ public class HttpHandlerConnectorTests { TestHttpHandler handler = new TestHttpHandler(response -> { response.setStatusCode(HttpStatus.OK); response.getHeaders().put("custom-header", Arrays.asList("h0", "h1")); - response.getCookies().add(cookie.getName(), cookie); + response.addCookie(cookie); return response.writeWith(Mono.just(toDataBuffer("Custom body"))); }); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java index 3ede8a5627..20fa7a0ce9 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java @@ -120,6 +120,19 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { CollectionUtils.unmodifiableMultiValueMap(this.cookies) : this.cookies); } + @Override + public void addCookie(ResponseCookie cookie) { + Assert.notNull(cookie, "'cookie' must not be null"); + + if (this.state.get() == State.COMMITTED) { + throw new IllegalStateException("Can't add the cookie " + cookie + + "because the HTTP response has already been committed"); + } + else { + getCookies().add(cookie.getName(), cookie); + } + } + @Override public String encodeUrl(String url) { return (this.urlEncoder != null ? this.urlEncoder.apply(url) : url); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponse.java index 63c55ea4fd..e2b0b7a5dc 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,6 +50,13 @@ public interface ServerHttpResponse extends ReactiveHttpOutputMessage { */ MultiValueMap getCookies(); + /** + * Add the given {@code ResponseCookie}. + * @param cookie the cookie to add + * @throws IllegalStateException if the response has already been committed + */ + void addCookie(ResponseCookie cookie); + /** * A mechanism for URL rewriting that applications and libraries such as * HTML template libraries to use consistently for all URLs emitted by diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponseDecorator.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponseDecorator.java index 4d99573d22..06328b5235 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponseDecorator.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServerHttpResponseDecorator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,6 +74,11 @@ public class ServerHttpResponseDecorator implements ServerHttpResponse { return getDelegate().getCookies(); } + @Override + public void addCookie(ResponseCookie cookie) { + getDelegate().addCookie(cookie); + } + @Override public String encodeUrl(String url) { return getDelegate().encodeUrl(url);