Skip to content

Commit 962c8c3

Browse files
committed
Prevent double encoding in stripPrefix method
The stripPrefix method was causing URLs to be encoded twice under certain conditions. This fix ensures proper handling of parameters to avoid redundant encoding. Signed-off-by: raccoonback <kosb15@naver.com>
1 parent 07aca3e commit 962c8c3

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ public static Function<ServerRequest, ServerRequest> stripPrefix(int parts) {
409409

410410
URI prefixedUri = UriComponentsBuilder.fromUri(request.uri())
411411
.replacePath(newPath.toString())
412-
.build()
412+
.build(true)
413413
.toUri();
414414
return ServerRequest.from(request).uri(prefixedUri).build();
415415
};

spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/BeforeFilterFunctionsTests.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,42 @@ void setPathWithEncodedParameters() {
157157
assertThat(result.uri().toString()).isEqualTo("http://localhost/new/path?foo%5B%5D=bar%5B%5D");
158158
}
159159

160+
@Test
161+
void stripPrefix() {
162+
MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/depth1/depth2/depth3")
163+
.buildRequest(null);
164+
165+
ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList());
166+
167+
ServerRequest result = BeforeFilterFunctions.stripPrefix(2).apply(request);
168+
169+
assertThat(result.uri().toString()).isEqualTo("http://localhost/depth3");
170+
}
171+
172+
@Test
173+
void stripPrefixWithEncodedPath() {
174+
MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/depth1/depth2/depth3/é")
175+
.buildRequest(null);
176+
177+
ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList());
178+
179+
ServerRequest result = BeforeFilterFunctions.stripPrefix(2).apply(request);
180+
181+
assertThat(result.uri().toString()).isEqualTo("http://localhost/depth3/%C3%A9");
182+
}
183+
184+
@Test
185+
void stripPrefixWithEncodedParameters() {
186+
MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/depth1/depth2/depth3")
187+
.queryParam("baz[]", "qux[]")
188+
.buildRequest(null);
189+
190+
ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList());
191+
192+
ServerRequest result = BeforeFilterFunctions.stripPrefix(2).apply(request);
193+
194+
assertThat(result.param("baz[]")).isPresent().hasValue("qux[]");
195+
assertThat(result.uri().toString()).isEqualTo("http://localhost/depth3?baz%5B%5D=qux%5B%5D");
196+
}
197+
160198
}

0 commit comments

Comments
 (0)