Skip to content

Commit 2fe3321

Browse files
committed
Fix pathExtension null-safety in Kotlin DSLs
Closes gh-32254
1 parent 8c3fc8c commit 2fe3321

File tree

6 files changed

+40
-6
lines changed

6 files changed

+40
-6
lines changed

spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/server/CoRouterFunctionDsl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ class CoRouterFunctionDsl internal constructor (private val init: (CoRouterFunct
452452
* Route to the given handler function if the given pathExtension predicate applies.
453453
* @see RouterFunctions.route
454454
*/
455-
fun pathExtension(predicate: (String) -> Boolean, f: suspend (ServerRequest) -> ServerResponse) {
455+
fun pathExtension(predicate: (String?) -> Boolean, f: suspend (ServerRequest) -> ServerResponse) {
456456
builder.add(RouterFunctions.route(RequestPredicates.pathExtension(predicate), asHandlerFunction(f)))
457457
}
458458

@@ -461,7 +461,7 @@ class CoRouterFunctionDsl internal constructor (private val init: (CoRouterFunct
461461
* predicate.
462462
* @see RequestPredicates.pathExtension
463463
*/
464-
fun pathExtension(predicate: (String) -> Boolean): RequestPredicate =
464+
fun pathExtension(predicate: (String?) -> Boolean): RequestPredicate =
465465
RequestPredicates.pathExtension(predicate)
466466

467467
/**

spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/server/RouterFunctionDsl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ class RouterFunctionDsl internal constructor (private val init: RouterFunctionDs
569569
* Route to the given handler function if the given pathExtension predicate applies.
570570
* @see RouterFunctions.route
571571
*/
572-
fun pathExtension(predicate: (String) -> Boolean, f: (ServerRequest) -> Mono<out ServerResponse>) {
572+
fun pathExtension(predicate: (String?) -> Boolean, f: (ServerRequest) -> Mono<out ServerResponse>) {
573573
builder.add(RouterFunctions.route(RequestPredicates.pathExtension(predicate), HandlerFunction { f(it).cast(ServerResponse::class.java) }))
574574
}
575575

@@ -578,7 +578,7 @@ class RouterFunctionDsl internal constructor (private val init: RouterFunctionDs
578578
* predicate.
579579
* @see RequestPredicates.pathExtension
580580
*/
581-
fun pathExtension(predicate: (String) -> Boolean): RequestPredicate =
581+
fun pathExtension(predicate: (String?) -> Boolean): RequestPredicate =
582582
RequestPredicates.pathExtension(predicate)
583583

584584
/**

spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/server/CoRouterFunctionDslTests.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,15 @@ class CoRouterFunctionDslTests {
112112
.verifyComplete()
113113
}
114114

115+
@Test
116+
fun pathExtension() {
117+
val mockRequest = get("https://example.com/test.properties").build()
118+
val request = DefaultServerRequest(MockServerWebExchange.from(mockRequest), emptyList())
119+
StepVerifier.create(sampleRouter().route(request))
120+
.expectNextCount(1)
121+
.verifyComplete()
122+
}
123+
115124
@Test
116125
fun resource() {
117126
val mockRequest = get("https://example.com/response2.txt").build()
@@ -324,6 +333,9 @@ class CoRouterFunctionDslTests {
324333
null
325334
}
326335
}
336+
GET("/**", pathExtension { it == "properties" }) {
337+
ok().bodyValueAndAwait("foo=bar")
338+
}
327339
path("/baz", ::handle)
328340
GET("/rendering") { RenderingResponse.create("index").buildAndAwait() }
329341
add(otherRouter)

spring-webflux/src/test/kotlin/org/springframework/web/reactive/function/server/RouterFunctionDslTests.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,15 @@ class RouterFunctionDslTests {
110110
.verifyComplete()
111111
}
112112

113+
@Test
114+
fun pathExtension() {
115+
val mockRequest = get("https://example.com/test.properties").build()
116+
val request = DefaultServerRequest(MockServerWebExchange.from(mockRequest), emptyList())
117+
StepVerifier.create(sampleRouter().route(request))
118+
.expectNextCount(1)
119+
.verifyComplete()
120+
}
121+
113122
@Test
114123
fun resource() {
115124
val mockRequest = get("https://example.com/response2.txt").build()
@@ -256,6 +265,9 @@ class RouterFunctionDslTests {
256265
Mono.empty()
257266
}
258267
}
268+
GET(pathExtension { it == "properties" }) {
269+
ok().bodyValue("foo=bar")
270+
}
259271
path("/baz", ::handle)
260272
GET("/rendering") { RenderingResponse.create("index").build() }
261273
add(otherRouter)

spring-webmvc/src/main/kotlin/org/springframework/web/servlet/function/RouterFunctionDsl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ class RouterFunctionDsl internal constructor (private val init: (RouterFunctionD
564564
* Route to the given handler function if the given pathExtension predicate applies.
565565
* @see RouterFunctions.route
566566
*/
567-
fun pathExtension(predicate: (String) -> Boolean, f: (ServerRequest) -> ServerResponse) {
567+
fun pathExtension(predicate: (String?) -> Boolean, f: (ServerRequest) -> ServerResponse) {
568568
builder.add(RouterFunctions.route(RequestPredicates.pathExtension(predicate), HandlerFunction(f)))
569569
}
570570

@@ -573,7 +573,7 @@ class RouterFunctionDsl internal constructor (private val init: (RouterFunctionD
573573
* predicate.
574574
* @see RequestPredicates.pathExtension
575575
*/
576-
fun pathExtension(predicate: (String) -> Boolean): RequestPredicate =
576+
fun pathExtension(predicate: (String?) -> Boolean): RequestPredicate =
577577
RequestPredicates.pathExtension(predicate)
578578

579579
/**

spring-webmvc/src/test/kotlin/org/springframework/web/servlet/function/RouterFunctionDslTests.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ class RouterFunctionDslTests {
8888
assertThat(sampleRouter().route(request).isPresent).isTrue()
8989
}
9090

91+
@Test
92+
fun pathExtension() {
93+
val servletRequest = PathPatternsTestUtils.initRequest("GET", "/test.properties", true)
94+
val request = DefaultServerRequest(servletRequest, emptyList())
95+
assertThat(sampleRouter().route(request).isPresent).isTrue()
96+
}
97+
9198
@Test
9299
fun resource() {
93100
val servletRequest = PathPatternsTestUtils.initRequest("GET","/response2.txt", true)
@@ -185,6 +192,9 @@ class RouterFunctionDslTests {
185192
null
186193
}
187194
}
195+
GET(pathExtension { it == "properties" }) {
196+
ok().body("foo=bar")
197+
}
188198
path("/baz", ::handle)
189199
GET("/rendering") { RenderingResponse.create("index").build() }
190200
add(otherRouter)

0 commit comments

Comments
 (0)