Skip to content

Commit 930f0f1

Browse files
committed
Add ServerRequest.cookies()
This commit introduces a cookies() method on ServerRequest, returning a MultiValueMap<String, HttpCookie>. Issue: SPR-15715
1 parent 621df7c commit 930f0f1

File tree

7 files changed

+126
-10
lines changed

7 files changed

+126
-10
lines changed

spring-test/src/main/java/org/springframework/mock/web/reactive/function/server/MockServerRequest.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.net.URI;
2121
import java.nio.charset.Charset;
2222
import java.security.Principal;
23+
import java.util.Arrays;
2324
import java.util.Collections;
2425
import java.util.LinkedHashMap;
2526
import java.util.List;
@@ -32,6 +33,7 @@
3233
import reactor.core.publisher.Flux;
3334
import reactor.core.publisher.Mono;
3435

36+
import org.springframework.http.HttpCookie;
3537
import org.springframework.http.HttpHeaders;
3638
import org.springframework.http.HttpMethod;
3739
import org.springframework.http.HttpRange;
@@ -59,6 +61,8 @@ public class MockServerRequest implements ServerRequest {
5961

6062
private final MockHeaders headers;
6163

64+
private final MultiValueMap<String, HttpCookie> cookies;
65+
6266
@Nullable
6367
private final Object body;
6468

@@ -75,13 +79,15 @@ public class MockServerRequest implements ServerRequest {
7579
private Principal principal;
7680

7781

78-
private MockServerRequest(HttpMethod method, URI uri, MockHeaders headers, @Nullable Object body,
82+
private MockServerRequest(HttpMethod method, URI uri, MockHeaders headers,
83+
MultiValueMap<String, HttpCookie> cookies, @Nullable Object body,
7984
Map<String, Object> attributes, MultiValueMap<String, String> queryParams,
8085
Map<String, String> pathVariables, @Nullable WebSession session, @Nullable Principal principal) {
8186

8287
this.method = method;
8388
this.uri = uri;
8489
this.headers = headers;
90+
this.cookies = cookies;
8591
this.body = body;
8692
this.attributes = attributes;
8793
this.queryParams = queryParams;
@@ -106,6 +112,11 @@ public Headers headers() {
106112
return this.headers;
107113
}
108114

115+
@Override
116+
public MultiValueMap<String, HttpCookie> cookies() {
117+
return this.cookies;
118+
}
119+
109120
@Override
110121
@SuppressWarnings("unchecked")
111122
public <S> S body(BodyExtractor<S, ? super ServerHttpRequest> extractor) {
@@ -182,6 +193,10 @@ public interface Builder {
182193

183194
Builder headers(HttpHeaders headers);
184195

196+
Builder cookie(HttpCookie... cookies);
197+
198+
Builder cookies(MultiValueMap<String, HttpCookie> cookies);
199+
185200
Builder attribute(String name, Object value);
186201

187202
Builder attributes(Map<String, Object> attributes);
@@ -212,6 +227,8 @@ private static class BuilderImpl implements Builder {
212227

213228
private MockHeaders headers = new MockHeaders(new HttpHeaders());
214229

230+
private MultiValueMap<String, HttpCookie> cookies = new LinkedMultiValueMap<>();
231+
215232
@Nullable
216233
private Object body;
217234

@@ -241,6 +258,19 @@ public Builder uri(URI uri) {
241258
return this;
242259
}
243260

261+
@Override
262+
public Builder cookie(HttpCookie... cookies) {
263+
Arrays.stream(cookies).forEach(cookie -> this.cookies.add(cookie.getName(), cookie));
264+
return this;
265+
}
266+
267+
@Override
268+
public Builder cookies(MultiValueMap<String, HttpCookie> cookies) {
269+
Assert.notNull(cookies, "'cookies' must not be null");
270+
this.cookies = cookies;
271+
return this;
272+
}
273+
244274
@Override
245275
public Builder header(String key, String value) {
246276
Assert.notNull(key, "'key' must not be null");
@@ -318,14 +348,14 @@ public Builder session(Principal principal) {
318348
@Override
319349
public MockServerRequest body(Object body) {
320350
this.body = body;
321-
return new MockServerRequest(this.method, this.uri, this.headers, this.body,
322-
this.attributes, this.queryParams, this.pathVariables, this.session,
351+
return new MockServerRequest(this.method, this.uri, this.headers, this.cookies,
352+
this.body, this.attributes, this.queryParams, this.pathVariables, this.session,
323353
this.principal);
324354
}
325355

326356
@Override
327357
public MockServerRequest build() {
328-
return new MockServerRequest(this.method, this.uri, this.headers, null,
358+
return new MockServerRequest(this.method, this.uri, this.headers, this.cookies, null,
329359
this.attributes, this.queryParams, this.pathVariables, this.session,
330360
this.principal);
331361
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import reactor.core.publisher.Flux;
3333
import reactor.core.publisher.Mono;
3434

35+
import org.springframework.http.HttpCookie;
3536
import org.springframework.http.HttpHeaders;
3637
import org.springframework.http.HttpMethod;
3738
import org.springframework.http.HttpRange;
@@ -40,6 +41,7 @@
4041
import org.springframework.http.server.reactive.ServerHttpRequest;
4142
import org.springframework.http.server.reactive.ServerHttpResponse;
4243
import org.springframework.util.Assert;
44+
import org.springframework.util.MultiValueMap;
4345
import org.springframework.web.reactive.function.BodyExtractor;
4446
import org.springframework.web.reactive.function.BodyExtractors;
4547
import org.springframework.web.reactive.function.UnsupportedMediaTypeException;
@@ -95,6 +97,11 @@ public Headers headers() {
9597
return this.headers;
9698
}
9799

100+
@Override
101+
public MultiValueMap<String, HttpCookie> cookies() {
102+
return request().getCookies();
103+
}
104+
98105
@Override
99106
public <T> T body(BodyExtractor<T, ? super ServerHttpRequest> extractor) {
100107
return body(extractor, Collections.emptyMap());

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@
3434
import reactor.core.publisher.Flux;
3535
import reactor.core.publisher.Mono;
3636

37+
import org.springframework.http.HttpCookie;
3738
import org.springframework.http.HttpMethod;
3839
import org.springframework.http.MediaType;
3940
import org.springframework.http.server.reactive.ServerHttpRequest;
4041
import org.springframework.lang.Nullable;
4142
import org.springframework.util.Assert;
43+
import org.springframework.util.MultiValueMap;
4244
import org.springframework.web.reactive.function.BodyExtractor;
4345
import org.springframework.web.server.WebSession;
4446
import org.springframework.web.util.UriUtils;
@@ -490,6 +492,11 @@ public Headers headers() {
490492
return this.request.headers();
491493
}
492494

495+
@Override
496+
public MultiValueMap<String, HttpCookie> cookies() {
497+
return this.request.cookies();
498+
}
499+
493500
@Override
494501
public <T> T body(BodyExtractor<T, ? super ServerHttpRequest> extractor) {
495502
return this.request.body(extractor);

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import reactor.core.publisher.Flux;
3030
import reactor.core.publisher.Mono;
3131

32+
import org.springframework.http.HttpCookie;
3233
import org.springframework.http.HttpHeaders;
3334
import org.springframework.http.HttpMethod;
3435
import org.springframework.http.HttpRange;
@@ -37,6 +38,7 @@
3738
import org.springframework.http.codec.json.Jackson2CodecSupport;
3839
import org.springframework.http.server.reactive.ServerHttpRequest;
3940
import org.springframework.lang.Nullable;
41+
import org.springframework.util.MultiValueMap;
4042
import org.springframework.web.reactive.function.BodyExtractor;
4143
import org.springframework.web.server.ServerWebExchange;
4244
import org.springframework.web.server.WebSession;
@@ -75,6 +77,11 @@ default String path() {
7577
*/
7678
Headers headers();
7779

80+
/**
81+
* Return the cookies of this request.
82+
*/
83+
MultiValueMap<String, HttpCookie> cookies();
84+
7885
/**
7986
* Extract the body with the given {@code BodyExtractor}.
8087
* @param extractor the {@code BodyExtractor} that reads from the request

spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/ServerRequestWrapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@
2929
import reactor.core.publisher.Flux;
3030
import reactor.core.publisher.Mono;
3131

32+
import org.springframework.http.HttpCookie;
3233
import org.springframework.http.HttpHeaders;
3334
import org.springframework.http.HttpMethod;
3435
import org.springframework.http.HttpRange;
3536
import org.springframework.http.MediaType;
3637
import org.springframework.http.server.reactive.ServerHttpRequest;
3738
import org.springframework.util.Assert;
39+
import org.springframework.util.MultiValueMap;
3840
import org.springframework.web.reactive.function.BodyExtractor;
3941
import org.springframework.web.reactive.function.server.HandlerFunction;
4042
import org.springframework.web.reactive.function.server.ServerRequest;
@@ -90,6 +92,11 @@ public Headers headers() {
9092
return this.delegate.headers();
9193
}
9294

95+
@Override
96+
public MultiValueMap<String, HttpCookie> cookies() {
97+
return this.delegate.cookies();
98+
}
99+
93100
@Override
94101
public <T> T body(BodyExtractor<T, ? super ServerHttpRequest> extractor) {
95102
return this.delegate.body(extractor);

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.springframework.core.io.buffer.DataBuffer;
3838
import org.springframework.core.io.buffer.DefaultDataBuffer;
3939
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
40+
import org.springframework.http.HttpCookie;
4041
import org.springframework.http.HttpHeaders;
4142
import org.springframework.http.HttpMethod;
4243
import org.springframework.http.HttpRange;
@@ -45,6 +46,8 @@
4546
import org.springframework.http.codec.HttpMessageReader;
4647
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
4748
import org.springframework.mock.http.server.reactive.test.MockServerWebExchange;
49+
import org.springframework.util.LinkedMultiValueMap;
50+
import org.springframework.util.MultiValueMap;
4851
import org.springframework.web.server.UnsupportedMediaTypeStatusException;
4952

5053
import static org.junit.Assert.*;
@@ -176,6 +179,22 @@ public void header() throws Exception {
176179
assertEquals(httpHeaders, headers.asHttpHeaders());
177180
}
178181

182+
@Test
183+
public void cookies() {
184+
HttpCookie cookie = new HttpCookie("foo", "bar");
185+
MockServerHttpRequest mockRequest = MockServerHttpRequest.method(HttpMethod.GET, "http://example.com").
186+
cookie(cookie).build();
187+
MockServerWebExchange exchange = new MockServerWebExchange(mockRequest);
188+
189+
DefaultServerRequest request = new DefaultServerRequest(exchange, messageReaders);
190+
191+
MultiValueMap<String, HttpCookie> expected = new LinkedMultiValueMap<>();
192+
expected.add("foo", cookie);
193+
194+
assertEquals(expected, request.cookies());
195+
196+
}
197+
179198
@Test
180199
public void body() throws Exception {
181200
DefaultDataBufferFactory factory = new DefaultDataBufferFactory();

0 commit comments

Comments
 (0)