MockServerHttpRequest and Response set cookie headers
Issue: SPR-15522
This commit is contained in:
@@ -21,6 +21,7 @@ import java.net.URI;
|
|||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -231,7 +232,7 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
/**
|
/**
|
||||||
* Add one or more cookies.
|
* Add one or more cookies.
|
||||||
*/
|
*/
|
||||||
B cookie(String name, HttpCookie... cookie);
|
B cookie(HttpCookie... cookie);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the given cookies.
|
* Add the given cookies.
|
||||||
@@ -390,8 +391,8 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BodyBuilder cookie(String name, HttpCookie... cookies) {
|
public BodyBuilder cookie(HttpCookie... cookies) {
|
||||||
this.cookies.put(name, Arrays.asList(cookies));
|
Arrays.stream(cookies).forEach(cookie -> this.cookies.add(cookie.getName(), cookie));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -485,9 +486,15 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
|
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
|
||||||
|
applyCookies();
|
||||||
return new MockServerHttpRequest(this.method, this.url, this.contextPath,
|
return new MockServerHttpRequest(this.method, this.url, this.contextPath,
|
||||||
this.headers, this.cookies, this.remoteAddress, body);
|
this.headers, this.cookies, this.remoteAddress, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void applyCookies() {
|
||||||
|
this.cookies.values().stream().flatMap(Collection::stream)
|
||||||
|
.forEach(cookie -> this.headers.add(HttpHeaders.COOKIE, cookie.toString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -18,6 +18,7 @@ package org.springframework.mock.http.server.reactive;
|
|||||||
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
@@ -28,6 +29,7 @@ import reactor.core.publisher.Mono;
|
|||||||
import org.springframework.core.io.buffer.DataBuffer;
|
import org.springframework.core.io.buffer.DataBuffer;
|
||||||
import org.springframework.core.io.buffer.DataBufferUtils;
|
import org.springframework.core.io.buffer.DataBufferUtils;
|
||||||
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
import org.springframework.http.server.reactive.AbstractServerHttpResponse;
|
import org.springframework.http.server.reactive.AbstractServerHttpResponse;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.MimeType;
|
import org.springframework.util.MimeType;
|
||||||
@@ -85,6 +87,8 @@ public class MockServerHttpResponse extends AbstractServerHttpResponse {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyCookies() {
|
protected void applyCookies() {
|
||||||
|
getCookies().values().stream().flatMap(Collection::stream)
|
||||||
|
.forEach(cookie -> getHeaders().add(HttpHeaders.SET_COOKIE, cookie.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.mock.http.server.reactive;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpCookie;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit tests for {@link MockServerHttpRequest}.
|
||||||
|
* @author Rossen Stoyanchev
|
||||||
|
*/
|
||||||
|
public class MockServerHttpRequestTests {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void cookieHeaderSet() throws Exception {
|
||||||
|
HttpCookie foo11 = new HttpCookie("foo1", "bar1");
|
||||||
|
HttpCookie foo12 = new HttpCookie("foo1", "bar2");
|
||||||
|
HttpCookie foo21 = new HttpCookie("foo2", "baz1");
|
||||||
|
HttpCookie foo22 = new HttpCookie("foo2", "baz2");
|
||||||
|
|
||||||
|
MockServerHttpRequest request = MockServerHttpRequest.get("/")
|
||||||
|
.cookie(foo11, foo12, foo21, foo22).build();
|
||||||
|
|
||||||
|
assertEquals(Arrays.asList(foo11, foo12), request.getCookies().get("foo1"));
|
||||||
|
assertEquals(Arrays.asList(foo21, foo22), request.getCookies().get("foo2"));
|
||||||
|
assertEquals(Arrays.asList("foo1=bar1", "foo1=bar2", "foo2=baz1", "foo2=baz2"),
|
||||||
|
request.getHeaders().get(HttpHeaders.COOKIE));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.mock.http.server.reactive;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpCookie;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.ResponseCookie;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit tests for {@link MockServerHttpResponse}.
|
||||||
|
* @author Rossen Stoyanchev
|
||||||
|
*/
|
||||||
|
public class MockServerHttpResponseTests {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void cookieHeaderSet() throws Exception {
|
||||||
|
|
||||||
|
ResponseCookie foo11 = ResponseCookie.from("foo1", "bar1").build();
|
||||||
|
ResponseCookie foo12 = ResponseCookie.from("foo1", "bar2").build();
|
||||||
|
ResponseCookie foo21 = ResponseCookie.from("foo2", "baz1").build();
|
||||||
|
ResponseCookie foo22 = ResponseCookie.from("foo2", "baz2").build();
|
||||||
|
|
||||||
|
MockServerHttpResponse response = new MockServerHttpResponse();
|
||||||
|
response.addCookie(foo11);
|
||||||
|
response.addCookie(foo12);
|
||||||
|
response.addCookie(foo21);
|
||||||
|
response.addCookie(foo22);
|
||||||
|
|
||||||
|
response.applyCookies();
|
||||||
|
|
||||||
|
assertEquals(Arrays.asList("foo1=bar1", "foo1=bar2", "foo2=baz1", "foo2=baz2"),
|
||||||
|
response.getHeaders().get(HttpHeaders.SET_COOKIE));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -71,4 +71,9 @@ public class HttpCookie {
|
|||||||
return (this.name.equalsIgnoreCase(otherCookie.getName()));
|
return (this.name.equalsIgnoreCase(otherCookie.getName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.name + '=' + this.value;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import java.time.Duration;
|
|||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An {@code HttpCookie} subclass with the additional attributes allowed in
|
* An {@code HttpCookie} subclass with the additional attributes allowed in
|
||||||
@@ -125,6 +126,34 @@ public final class ResponseCookie extends HttpCookie {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(getName()).append('=').append(getValue());
|
||||||
|
if (StringUtils.hasText(getPath())) {
|
||||||
|
sb.append("; Path=").append(getPath());
|
||||||
|
}
|
||||||
|
if (StringUtils.hasText(this.domain)) {
|
||||||
|
sb.append("; Domain=").append(this.domain);
|
||||||
|
}
|
||||||
|
if (!this.maxAge.isNegative()) {
|
||||||
|
sb.append("; Max-Age=").append(this.maxAge);
|
||||||
|
sb.append("; Expires=");
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
long seconds = this.maxAge.getSeconds();
|
||||||
|
headers.setExpires(seconds > 0 ? System.currentTimeMillis() + seconds : 0);
|
||||||
|
sb.append(headers.getFirst(HttpHeaders.EXPIRES));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.secure) {
|
||||||
|
sb.append("; Secure");
|
||||||
|
}
|
||||||
|
if (this.httpOnly) {
|
||||||
|
sb.append("; HttpOnly");
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory method to obtain a builder for a server-defined cookie that starts
|
* Factory method to obtain a builder for a server-defined cookie that starts
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import java.net.URI;
|
|||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -231,7 +232,7 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
/**
|
/**
|
||||||
* Add one or more cookies.
|
* Add one or more cookies.
|
||||||
*/
|
*/
|
||||||
B cookie(String name, HttpCookie... cookie);
|
B cookie(HttpCookie... cookie);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the given cookies.
|
* Add the given cookies.
|
||||||
@@ -390,8 +391,8 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BodyBuilder cookie(String name, HttpCookie... cookies) {
|
public BodyBuilder cookie(HttpCookie... cookies) {
|
||||||
this.cookies.put(name, Arrays.asList(cookies));
|
Arrays.stream(cookies).forEach(cookie -> this.cookies.add(cookie.getName(), cookie));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -485,9 +486,15 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
|
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
|
||||||
|
applyCookies();
|
||||||
return new MockServerHttpRequest(this.method, this.url, this.contextPath,
|
return new MockServerHttpRequest(this.method, this.url, this.contextPath,
|
||||||
this.headers, this.cookies, this.remoteAddress, body);
|
this.headers, this.cookies, this.remoteAddress, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void applyCookies() {
|
||||||
|
this.cookies.values().stream().flatMap(Collection::stream)
|
||||||
|
.forEach(cookie -> this.headers.add(HttpHeaders.COOKIE, cookie.toString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -18,6 +18,7 @@ package org.springframework.mock.http.server.reactive.test;
|
|||||||
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
@@ -28,6 +29,7 @@ import reactor.core.publisher.Mono;
|
|||||||
import org.springframework.core.io.buffer.DataBuffer;
|
import org.springframework.core.io.buffer.DataBuffer;
|
||||||
import org.springframework.core.io.buffer.DataBufferUtils;
|
import org.springframework.core.io.buffer.DataBufferUtils;
|
||||||
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
import org.springframework.http.server.reactive.AbstractServerHttpResponse;
|
import org.springframework.http.server.reactive.AbstractServerHttpResponse;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.MimeType;
|
import org.springframework.util.MimeType;
|
||||||
@@ -85,6 +87,8 @@ public class MockServerHttpResponse extends AbstractServerHttpResponse {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void applyCookies() {
|
protected void applyCookies() {
|
||||||
|
getCookies().values().stream().flatMap(Collection::stream)
|
||||||
|
.forEach(cookie -> getHeaders().add(HttpHeaders.SET_COOKIE, cookie.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ public class CookieValueMethodArgumentResolverTests {
|
|||||||
@Test
|
@Test
|
||||||
public void resolveCookieArgument() {
|
public void resolveCookieArgument() {
|
||||||
HttpCookie expected = new HttpCookie("name", "foo");
|
HttpCookie expected = new HttpCookie("name", "foo");
|
||||||
ServerWebExchange exchange = MockServerHttpRequest.get("/").cookie(expected.getName(), expected).toExchange();
|
ServerWebExchange exchange = MockServerHttpRequest.get("/").cookie(expected).toExchange();
|
||||||
|
|
||||||
Mono<Object> mono = this.resolver.resolveArgument(
|
Mono<Object> mono = this.resolver.resolveArgument(
|
||||||
this.cookieParameter, this.bindingContext, exchange);
|
this.cookieParameter, this.bindingContext, exchange);
|
||||||
@@ -109,7 +109,7 @@ public class CookieValueMethodArgumentResolverTests {
|
|||||||
@Test
|
@Test
|
||||||
public void resolveCookieStringArgument() {
|
public void resolveCookieStringArgument() {
|
||||||
HttpCookie cookie = new HttpCookie("name", "foo");
|
HttpCookie cookie = new HttpCookie("name", "foo");
|
||||||
ServerWebExchange exchange = MockServerHttpRequest.get("/").cookie(cookie.getName(), cookie).toExchange();
|
ServerWebExchange exchange = MockServerHttpRequest.get("/").cookie(cookie).toExchange();
|
||||||
|
|
||||||
Mono<Object> mono = this.resolver.resolveArgument(
|
Mono<Object> mono = this.resolver.resolveArgument(
|
||||||
this.cookieStringParameter, this.bindingContext, exchange);
|
this.cookieStringParameter, this.bindingContext, exchange);
|
||||||
|
|||||||
Reference in New Issue
Block a user