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"); + } + }