From d04883f8391dff7ecbcd1e336a0fa53e8fdae759 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Tue, 11 Feb 2025 11:08:00 +0000 Subject: [PATCH] HTTP Interface client handles query param with ":" Closes gh-34364 --- .../web/service/invoker/HttpRequestValues.java | 2 +- .../invoker/HttpRequestValuesTests.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpRequestValues.java b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpRequestValues.java index e2c95915dcab..309aa60faf4c 100644 --- a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpRequestValues.java +++ b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpRequestValues.java @@ -493,7 +493,7 @@ private String appendQueryParams( UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(uriTemplate); for (Map.Entry> entry : requestParams.entrySet()) { - String nameVar = entry.getKey(); + String nameVar = entry.getKey().replace(":", "%3A"); // suppress treatment as regex uriVars.put(nameVar, entry.getKey()); for (int j = 0; j < entry.getValue().size(); j++) { String valueVar = nameVar + "[" + j + "]"; diff --git a/spring-web/src/test/java/org/springframework/web/service/invoker/HttpRequestValuesTests.java b/spring-web/src/test/java/org/springframework/web/service/invoker/HttpRequestValuesTests.java index f929e0c72bbe..5f026afe6545 100644 --- a/spring-web/src/test/java/org/springframework/web/service/invoker/HttpRequestValuesTests.java +++ b/spring-web/src/test/java/org/springframework/web/service/invoker/HttpRequestValuesTests.java @@ -99,6 +99,24 @@ void queryParamsWithUriTemplate() { .isEqualTo("/path?param1=1st%20value¶m2=2nd%20value%20A¶m2=2nd%20value%20B"); } + @Test // gh-34364 + void queryParamWithSemicolon() { + HttpRequestValues requestValues = HttpRequestValues.builder().setHttpMethod(HttpMethod.POST) + .setUriTemplate("/path") + .addRequestParameter("userId:eq", "test value") + .build(); + + String uriTemplate = requestValues.getUriTemplate(); + assertThat(uriTemplate).isEqualTo("/path?{userId%3Aeq}={userId%3Aeq[0]}"); + + URI uri = UriComponentsBuilder.fromUriString(uriTemplate) + .encode() + .build(requestValues.getUriVariables()); + + assertThat(uri.toString()) + .isEqualTo("/path?userId%3Aeq=test%20value"); + } + @Test void queryParamsWithPreparedUri() {