Preserve parameter order in DefaultServerRequest's ServletParametersMap

Prior to this commit, DefaultServerRequest's ServletParametersMap lost
the original parameter order when entrySet() was invoked.

To address that, this commit revises ServletParametersMap.entrySet() so
that it stores the results in a LinkedHashSet, thereby retaining the
original order.

Closes gh-36966
This commit is contained in:
Sam Brannen
2026-06-25 13:57:34 +02:00
parent 6ac642e301
commit b00f691655
2 changed files with 16 additions and 1 deletions
@@ -33,6 +33,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -443,7 +444,7 @@ class DefaultServerRequest implements ServerRequest {
List<String> value = Arrays.asList(entry.getValue());
return new SimpleImmutableEntry<>(entry.getKey(), value);
})
.collect(Collectors.toSet());
.collect(Collectors.toCollection(LinkedHashSet::new));
}
@Override
@@ -167,6 +167,20 @@ class DefaultServerRequestTests {
assertThat(request.param("foo")).contains("bar");
}
@Test // gh-36966
void paramsEntrySetPreservesOrder() {
MockHttpServletRequest servletRequest = PathPatternsTestUtils.initRequest("GET", "/", true);
servletRequest.setParameter("charlie", "3");
servletRequest.setParameter("alpha", "1");
servletRequest.setParameter("bravo", "2");
DefaultServerRequest request = new DefaultServerRequest(servletRequest, this.messageConverters);
assertThat(request.params().entrySet())
.extracting(Map.Entry::getKey)
.containsExactly("charlie", "alpha", "bravo");
}
@Test
void multipartData() throws Exception {
MockPart formPart = new MockPart("form", "foo".getBytes(UTF_8));