Fix expansion of query param with same name

See gh-34783

Signed-off-by: whl <whlit.cola@gmail.com>
This commit is contained in:
whl 2025-04-20 13:53:47 +08:00 committed by rstoyanchev
parent 253f321e8b
commit 124582d910
2 changed files with 15 additions and 1 deletions

View File

@ -451,7 +451,7 @@ final class HierarchicalUriComponents extends UriComponents {
UriTemplateVariables queryVariables = new QueryUriTemplateVariables(variables);
this.queryParams.forEach((key, values) -> {
String name = expandUriComponent(key, queryVariables, this.variableEncoder);
List<String> expandedValues = new ArrayList<>(values.size());
List<String> expandedValues = result.getOrDefault(name, new ArrayList<>(values.size()));
for (String value : values) {
expandedValues.add(expandUriComponent(value, queryVariables, this.variableEncoder));
}

View File

@ -629,6 +629,20 @@ class UriComponentsBuilderTests {
assertThat(uri.toString()).isEqualTo("ws://example.org:7777/path?q=1#foo");
}
@ParameterizedTest
@EnumSource
void parseBuildAndExpandHierarchicalWithDuplicateQueryKeys(ParserType parserType) {
UriComponents result = UriComponentsBuilder.fromUriString("/?{pk1}={pv1}&{pk2}={pv2}", parserType)
.buildAndExpand("k1", "v1", "k1", "v2");
assertThat(result.getQuery()).isEqualTo("k1=v1&k1=v2");
assertThat(result.getQueryParams().get("k1")).containsExactly("v1", "v2");
UriComponents result2 = UriComponentsBuilder.fromUriString("/?{pk1}={pv1}&{pk2}={pv2}", parserType)
.buildAndExpand(Map.of("pk1", "k1", "pv1", "v1", "pk2", "k1", "pv2", "v2"));
assertThat(result2.getQuery()).isEqualTo("k1=v1&k1=v2");
assertThat(result.getQueryParams().get("k1")).containsExactly("v1", "v2");
}
@ParameterizedTest
@EnumSource
void buildAndExpandOpaque(ParserType parserType) {