Fix improper encoding of '+' in query parameter values when rewrite query parameter

Signed-off-by: raccoonback <kosb15@naver.com>
This commit is contained in:
raccoonback
2025-05-15 13:19:35 +09:00
parent d12a5873f4
commit a840fca27b
2 changed files with 19 additions and 2 deletions

View File

@@ -351,7 +351,7 @@ public abstract class BeforeFilterFunctions {
queryParams.add(name, replacement);
}
MultiValueMap<String, String> encodedQueryParams = UriUtils.encodeQueryParams(queryParams);
MultiValueMap<String, String> encodedQueryParams = MvcUtils.encodeQueryParams(queryParams);
URI rewrittenUri = UriComponentsBuilder.fromUri(request.uri())
.replaceQueryParams(unmodifiableMultiValueMap(encodedQueryParams))
.build(true)

View File

@@ -129,11 +129,27 @@ class BeforeFilterFunctionsTests {
assertThat(result.uri().toString()).hasToString("http://localhost/path?baz=qux&foo%5B%5D=replacement%5B%5D");
}
@Test
void rewritePlusSignRequestParameter() {
MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/path")
.param("foo", "bar")
.param("baz", "qux")
.buildRequest(null);
ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList());
ServerRequest result = BeforeFilterFunctions.rewriteRequestParameter("foo", "replacement+").apply(request);
assertThat(result.param("foo")).isPresent().hasValue("replacement+");
assertThat(result.uri().toString()).hasToString("http://localhost/path?baz=qux&foo=replacement%2B");
}
@Test
void rewriteRequestParameterWithEncodedRemainParameters() {
MockHttpServletRequest servletRequest = MockMvcRequestBuilders.get("http://localhost/path")
.param("foo", "bar")
.param("baz[]", "qux[]")
.param("quux", "corge+")
.buildRequest(null);
ServerRequest request = ServerRequest.create(servletRequest, Collections.emptyList());
@@ -141,7 +157,8 @@ class BeforeFilterFunctionsTests {
ServerRequest result = BeforeFilterFunctions.rewriteRequestParameter("foo", "replacement").apply(request);
assertThat(result.param("foo")).isPresent().hasValue("replacement");
assertThat(result.uri().toString()).hasToString("http://localhost/path?baz%5B%5D=qux%5B%5D&foo=replacement");
assertThat(result.uri().toString())
.hasToString("http://localhost/path?baz%5B%5D=qux%5B%5D&quux=corge%2B&foo=replacement");
}
@Test