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 96dac3d1..c96fffdd 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 @@ -329,10 +329,10 @@ public abstract class BeforeFilterFunctions { Pattern pattern = Pattern.compile(regexp); return request -> { MvcUtils.addOriginalRequestUrl(request, request.uri()); - String path = request.uri().getRawPath(); + String path = request.uri().getPath(); String newPath = pattern.matcher(path).replaceAll(normalizedReplacement); - URI rewrittenUri = UriComponentsBuilder.fromUri(request.uri()).replacePath(newPath).build().toUri(); + URI rewrittenUri = UriComponentsBuilder.fromUri(request.uri()).replacePath(newPath).encode().build().toUri(); ServerRequest modified = ServerRequest.from(request).uri(rewrittenUri).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 095ec4f9..309b81bf 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 @@ -28,6 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** * @author raccoonback + * @author Jens Mallien */ class BeforeFilterFunctionsTests { @@ -181,4 +182,52 @@ class BeforeFilterFunctionsTests { assertThat(result.uri().toString()).hasToString("http://localhost/depth3?baz%5B%5D=qux%5B%5D"); } + @Test + void rewritePath() { + MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/get") + .buildRequest(null); + + ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList()); + + ServerRequest modified = BeforeFilterFunctions.rewritePath("get", "modified").apply(request); + + assertThat(modified.uri().getRawPath()).isEqualTo("/modified"); + } + + @Test + void rewritePathWithSpace() { + MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/get/path/with spaces") + .buildRequest(null); + + ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList()); + + ServerRequest modified = BeforeFilterFunctions.rewritePath("get", "modified").apply(request); + + assertThat(modified.uri().getRawPath()).isEqualTo("/modified/path/with%20spaces"); + } + + @Test + void rewritePathWithEnDash() { + MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/get/path/with–en–dashes") + .buildRequest(null); + + ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList()); + + ServerRequest modified = BeforeFilterFunctions.rewritePath("get", "modified").apply(request); + + assertThat(modified.uri().getRawPath()).isEqualTo("/modified/path/with%E2%80%93en%E2%80%93dashes"); + } + + @Test + void rewritePathWithEnDashAndSpace() { + MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/get/path/with–en–dashes and spaces") + .buildRequest(null); + + ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList()); + + ServerRequest modified = BeforeFilterFunctions.rewritePath("get", "modified").apply(request); + + assertThat(modified.uri().getRawPath()).isEqualTo("/modified/path/with%E2%80%93en%E2%80%93dashes%20and%20spaces"); + } + }