Skip to content

Commit b1bf8c5

Browse files
committed
Prevent NPE when using pathExtension predicate
This commit ensures pathExtension predicate is skipped when the value is null, in order to provide a more predictable behavior, and allow a better compatibility with collections not supporting null elements like the ones created by List#of. Closes gh-32404
1 parent 6767f70 commit b1bf8c5

File tree

4 files changed

+44
-2
lines changed

4 files changed

+44
-2
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ public PathExtensionPredicate(String extension) {
843843
@Override
844844
public boolean test(ServerRequest request) {
845845
String pathExtension = UriUtils.extractFileExtension(request.path());
846-
return this.extensionPredicate.test(pathExtension);
846+
return (pathExtension != null && this.extensionPredicate.test(pathExtension));
847847
}
848848

849849
@Override

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

+28
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.net.URI;
2020
import java.util.Collections;
21+
import java.util.List;
2122
import java.util.function.Function;
2223

2324
import org.junit.jupiter.api.Test;
@@ -33,6 +34,7 @@
3334

3435
/**
3536
* @author Arjen Poutsma
37+
* @author Sebastien Deleuze
3638
*/
3739
class RequestPredicatesTests {
3840

@@ -317,6 +319,32 @@ void pathExtension() {
317319
assertThat(predicate.test(request)).isFalse();
318320
}
319321

322+
@Test
323+
void pathExtensionPredicate() {
324+
List<String> extensions = List.of("foo", "bar");
325+
RequestPredicate predicate = RequestPredicates.pathExtension(extensions::contains);
326+
327+
URI uri = URI.create("https://localhost/file.foo");
328+
MockServerHttpRequest mockRequest = MockServerHttpRequest.method(HttpMethod.GET, uri).build();
329+
ServerRequest request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), Collections.emptyList());
330+
assertThat(predicate.test(request)).isTrue();
331+
332+
uri = URI.create("https://localhost/file.bar");
333+
mockRequest = MockServerHttpRequest.method(HttpMethod.GET, uri).build();
334+
request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), Collections.emptyList());
335+
assertThat(predicate.test(request)).isTrue();
336+
337+
uri = URI.create("https://localhost/file");
338+
mockRequest = MockServerHttpRequest.method(HttpMethod.GET, uri).build();
339+
request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), Collections.emptyList());
340+
assertThat(predicate.test(request)).isFalse();
341+
342+
uri = URI.create("https://localhost/file.baz");
343+
mockRequest = MockServerHttpRequest.method(HttpMethod.GET, uri).build();
344+
request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), Collections.emptyList());
345+
assertThat(predicate.test(request)).isFalse();
346+
}
347+
320348
@Test
321349
void queryParam() {
322350
MockServerHttpRequest mockRequest = MockServerHttpRequest.get("https://example.com")

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ public PathExtensionPredicate(String extension) {
841841
@Override
842842
public boolean test(ServerRequest request) {
843843
String pathExtension = UriUtils.extractFileExtension(request.path());
844-
return this.extensionPredicate.test(pathExtension);
844+
return (pathExtension != null && this.extensionPredicate.test(pathExtension));
845845
}
846846

847847
@Override

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

+14
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.web.servlet.function;
1818

1919
import java.util.Collections;
20+
import java.util.List;
2021
import java.util.function.Consumer;
2122
import java.util.function.Function;
2223

@@ -34,6 +35,7 @@
3435

3536
/**
3637
* @author Arjen Poutsma
38+
* @author Sebastien Deleuze
3739
*/
3840
class RequestPredicatesTests {
3941

@@ -232,6 +234,18 @@ void pathExtension() {
232234
assertThat(predicate.test(initRequest("GET", "/FILE.TXT"))).isFalse();
233235

234236
assertThat(predicate.test(initRequest("GET", "/file.foo"))).isFalse();
237+
assertThat(predicate.test(initRequest("GET", "/file"))).isFalse();
238+
}
239+
240+
@Test
241+
void pathExtensionPredicate() {
242+
List<String> extensions = List.of("foo", "bar");
243+
RequestPredicate predicate = RequestPredicates.pathExtension(extensions::contains);
244+
245+
assertThat(predicate.test(initRequest("GET", "/file.foo"))).isTrue();
246+
assertThat(predicate.test(initRequest("GET", "/file.bar"))).isTrue();
247+
assertThat(predicate.test(initRequest("GET", "/file"))).isFalse();
248+
assertThat(predicate.test(initRequest("GET", "/file.baz"))).isFalse();
235249
}
236250

237251
@Test

0 commit comments

Comments
 (0)