From 6619e607c5d8a1566a302941a87a1d513e615dd3 Mon Sep 17 00:00:00 2001 From: Sebastien <5930188+SebHeuze@users.noreply.github.com> Date: Tue, 15 Apr 2025 22:12:06 +0200 Subject: [PATCH] Fix prefixPath double encoding Fixes gh-3769 Signed-off-by: Sebastien <5930188+SebHeuze@users.noreply.github.com> --- .../mvc/filter/BeforeFilterFunctions.java | 3 +- .../filter/BeforeFilterFunctionsTests.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java index 6cd2eeedfa..22250a8c2e 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java @@ -195,7 +195,8 @@ public static Function prefixPath(String prefix) { String newPath = uri.getRawPath() + request.uri().getRawPath(); - URI prefixedUri = UriComponentsBuilder.fromUri(request.uri()).replacePath(newPath).build().toUri(); + URI prefixedUri = UriComponentsBuilder.fromUri(request.uri()) + .replacePath(newPath).build(true).toUri(); return ServerRequest.from(request).uri(prefixedUri).build(); }; } diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctionsTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctionsTests.java index 2f23adc25e..bb03ab7885 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctionsTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctionsTests.java @@ -245,4 +245,32 @@ void rewritePathWithEnDashAndSpace() { .isEqualTo("/modified/path/with%E2%80%93en%E2%80%93dashes%20and%20spaces"); } + @Test + void prefixPath() { + MockHttpServletRequest servletRequest = MockMvcRequestBuilders + .get("http://localhost/get").buildRequest(null); + + ServerRequest request = ServerRequest.create(servletRequest, + Collections.emptyList()); + + ServerRequest modified = BeforeFilterFunctions.prefixPath("/prefix") + .apply(request); + + assertThat(modified.uri().getRawPath()).isEqualTo("/prefix/get"); + } + + @Test + void prefixEncodedPath() { + MockHttpServletRequest servletRequest = MockMvcRequestBuilders + .get("http://localhost/get/é").buildRequest(null); + + ServerRequest request = ServerRequest.create(servletRequest, + Collections.emptyList()); + + ServerRequest modified = BeforeFilterFunctions.prefixPath("/pre fix") + .apply(request); + + assertThat(modified.uri().getRawPath()).isEqualTo("/pre%20fix/get/%C3%A9"); + } + }