Skip to content

Commit 124582d

Browse files
whlitrstoyanchev
authored andcommitted
Fix expansion of query param with same name
See gh-34783 Signed-off-by: whl <[email protected]>
1 parent 253f321 commit 124582d

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ private MultiValueMap<String, String> expandQueryParams(UriTemplateVariables var
451451
UriTemplateVariables queryVariables = new QueryUriTemplateVariables(variables);
452452
this.queryParams.forEach((key, values) -> {
453453
String name = expandUriComponent(key, queryVariables, this.variableEncoder);
454-
List<String> expandedValues = new ArrayList<>(values.size());
454+
List<String> expandedValues = result.getOrDefault(name, new ArrayList<>(values.size()));
455455
for (String value : values) {
456456
expandedValues.add(expandUriComponent(value, queryVariables, this.variableEncoder));
457457
}

spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

+14
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,20 @@ void parseBuildAndExpandHierarchical(ParserType parserType) {
629629
assertThat(uri.toString()).isEqualTo("ws://example.org:7777/path?q=1#foo");
630630
}
631631

632+
@ParameterizedTest
633+
@EnumSource
634+
void parseBuildAndExpandHierarchicalWithDuplicateQueryKeys(ParserType parserType) {
635+
UriComponents result = UriComponentsBuilder.fromUriString("/?{pk1}={pv1}&{pk2}={pv2}", parserType)
636+
.buildAndExpand("k1", "v1", "k1", "v2");
637+
assertThat(result.getQuery()).isEqualTo("k1=v1&k1=v2");
638+
assertThat(result.getQueryParams().get("k1")).containsExactly("v1", "v2");
639+
640+
UriComponents result2 = UriComponentsBuilder.fromUriString("/?{pk1}={pv1}&{pk2}={pv2}", parserType)
641+
.buildAndExpand(Map.of("pk1", "k1", "pv1", "v1", "pk2", "k1", "pv2", "v2"));
642+
assertThat(result2.getQuery()).isEqualTo("k1=v1&k1=v2");
643+
assertThat(result.getQueryParams().get("k1")).containsExactly("v1", "v2");
644+
}
645+
632646
@ParameterizedTest
633647
@EnumSource
634648
void buildAndExpandOpaque(ParserType parserType) {

0 commit comments

Comments
 (0)