Skip to content

Commit 6156900

Browse files
committed
CORS support in HTTP header predicate
This commit introduces CORS support for the HeadersPredicate in WebMvc.fn and WebFlux.fn. Closes gh-24564
1 parent 1fd447f commit 6156900

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,12 @@ public HeadersPredicate(Predicate<ServerRequest.Headers> headersPredicate) {
550550

551551
@Override
552552
public boolean test(ServerRequest request) {
553-
return this.headersPredicate.test(request.headers());
553+
if (CorsUtils.isPreFlightRequest(request.exchange().getRequest())) {
554+
return true;
555+
}
556+
else {
557+
return this.headersPredicate.test(request.headers());
558+
}
554559
}
555560

556561
@Override

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,18 @@ public void headers() {
198198
assertThat(predicate.test(request)).isFalse();
199199
}
200200

201+
@Test
202+
public void headersCors() {
203+
RequestPredicate predicate = RequestPredicates.headers(headers -> false);
204+
MockServerHttpRequest mockRequest = MockServerHttpRequest.options("https://example.com")
205+
.header("Origin", "https://example.com")
206+
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "PUT")
207+
.build();
208+
ServerRequest request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), Collections.emptyList());
209+
assertThat(predicate.test(request)).isTrue();
210+
}
211+
212+
201213
@Test
202214
public void contentType() {
203215
MediaType json = MediaType.APPLICATION_JSON;

spring-webmvc/src/main/java/org/springframework/web/servlet/function/RequestPredicates.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,12 @@ public HeadersPredicate(Predicate<ServerRequest.Headers> headersPredicate) {
543543

544544
@Override
545545
public boolean test(ServerRequest request) {
546-
return this.headersPredicate.test(request.headers());
546+
if (CorsUtils.isPreFlightRequest(request.servletRequest())) {
547+
return true;
548+
}
549+
else {
550+
return this.headersPredicate.test(request.headers());
551+
}
547552
}
548553

549554
@Override

spring-webmvc/src/test/java/org/springframework/web/servlet/function/RequestPredicatesTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,16 @@ public void headers() {
197197
assertThat(predicate.test(request)).isFalse();
198198
}
199199

200+
@Test
201+
public void headersCors() {
202+
RequestPredicate predicate = RequestPredicates.headers(headers -> false);
203+
MockHttpServletRequest servletRequest = new MockHttpServletRequest("OPTIONS", "https://example.com");
204+
servletRequest.addHeader("Origin", "https://example.com");
205+
servletRequest.addHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "PUT");
206+
ServerRequest request = new DefaultServerRequest(servletRequest, emptyList());
207+
assertThat(predicate.test(request)).isTrue();
208+
}
209+
200210
@Test
201211
public void contentType() {
202212
MediaType json = MediaType.APPLICATION_JSON;

0 commit comments

Comments
 (0)