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>
This commit is contained in:
raccoonback
2025-01-05 15:57:37 +09:00
parent 07aca3e63e
commit 962c8c34e5
2 changed files with 39 additions and 1 deletions

View File

@@ -409,7 +409,7 @@ public abstract class BeforeFilterFunctions {
URI prefixedUri = UriComponentsBuilder.fromUri(request.uri())
.replacePath(newPath.toString())
.build()
.build(true)
.toUri();
return ServerRequest.from(request).uri(prefixedUri).build();
};

View File

@@ -157,4 +157,42 @@ class BeforeFilterFunctionsTests {
assertThat(result.uri().toString()).isEqualTo("http://localhost/new/path?foo%5B%5D=bar%5B%5D");
}
@Test
void stripPrefix() {
MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/depth1/depth2/depth3")
.buildRequest(null);
ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList());
ServerRequest result = BeforeFilterFunctions.stripPrefix(2).apply(request);
assertThat(result.uri().toString()).isEqualTo("http://localhost/depth3");
}
@Test
void stripPrefixWithEncodedPath() {
MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/depth1/depth2/depth3/é")
.buildRequest(null);
ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList());
ServerRequest result = BeforeFilterFunctions.stripPrefix(2).apply(request);
assertThat(result.uri().toString()).isEqualTo("http://localhost/depth3/%C3%A9");
}
@Test
void stripPrefixWithEncodedParameters() {
MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/depth1/depth2/depth3")
.queryParam("baz[]", "qux[]")
.buildRequest(null);
ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList());
ServerRequest result = BeforeFilterFunctions.stripPrefix(2).apply(request);
assertThat(result.param("baz[]")).isPresent().hasValue("qux[]");
assertThat(result.uri().toString()).isEqualTo("http://localhost/depth3?baz%5B%5D=qux%5B%5D");
}
}