Skip to content

Commit d04883f

Browse files
committed
HTTP Interface client handles query param with ":"
Closes gh-34364
1 parent 9f55296 commit d04883f

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

spring-web/src/main/java/org/springframework/web/service/invoker/HttpRequestValues.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ private String appendQueryParams(
493493

494494
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(uriTemplate);
495495
for (Map.Entry<String, List<String>> entry : requestParams.entrySet()) {
496-
String nameVar = entry.getKey();
496+
String nameVar = entry.getKey().replace(":", "%3A"); // suppress treatment as regex
497497
uriVars.put(nameVar, entry.getKey());
498498
for (int j = 0; j < entry.getValue().size(); j++) {
499499
String valueVar = nameVar + "[" + j + "]";

spring-web/src/test/java/org/springframework/web/service/invoker/HttpRequestValuesTests.java

+18
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,24 @@ void queryParamsWithUriTemplate() {
9999
.isEqualTo("/path?param1=1st%20value&param2=2nd%20value%20A&param2=2nd%20value%20B");
100100
}
101101

102+
@Test // gh-34364
103+
void queryParamWithSemicolon() {
104+
HttpRequestValues requestValues = HttpRequestValues.builder().setHttpMethod(HttpMethod.POST)
105+
.setUriTemplate("/path")
106+
.addRequestParameter("userId:eq", "test value")
107+
.build();
108+
109+
String uriTemplate = requestValues.getUriTemplate();
110+
assertThat(uriTemplate).isEqualTo("/path?{userId%3Aeq}={userId%3Aeq[0]}");
111+
112+
URI uri = UriComponentsBuilder.fromUriString(uriTemplate)
113+
.encode()
114+
.build(requestValues.getUriVariables());
115+
116+
assertThat(uri.toString())
117+
.isEqualTo("/path?userId%3Aeq=test%20value");
118+
}
119+
102120
@Test
103121
void queryParamsWithPreparedUri() {
104122

0 commit comments

Comments
 (0)