From a4963537700db2ef671d563638de577e18465f65 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sat, 31 Aug 2019 11:44:04 +0200 Subject: [PATCH 1/2] Delete dead code --- .../src/test/java/org/springframework/http/HttpHeadersTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java index 1a97828e70..45ae742e2d 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -514,7 +514,6 @@ public class HttpHeadersTests { assertTrue(headers.getFirstZonedDateTime(HttpHeaders.DATE).isEqual(date)); headers.clear(); - ZonedDateTime otherDate = ZonedDateTime.of(2010, 12, 18, 10, 20, 0, 0, ZoneId.of("GMT")); headers.add(HttpHeaders.DATE, "Fri, 02 Jun 2017 02:22:00 GMT"); headers.add(HttpHeaders.DATE, "Sat, 18 Dec 2010 10:20:00 GMT"); assertTrue(headers.getFirstZonedDateTime(HttpHeaders.DATE).isEqual(date)); From 9729b460f1a418997843c946ff5cdbfc870b0094 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sat, 31 Aug 2019 12:26:06 +0200 Subject: [PATCH 2/2] Retain entry set order in read-only HttpHeaders Prior to this commit, the entry set of read-only HttpHeaders lost the original headers' ordering. The changes in commit ce7278aaf4 introduced a regression in the read-only HttpHeaders support. Specifically, the implementation of entrySet() in the internal ReadOnlyHttpHeaders class converted the original entry set to an immutable, non-ordered set of immutable entries. This commit fixes this issue by converting the original entry set to an immutable, ordered set of immutable entries. Closes gh-23551 --- .../http/ReadOnlyHttpHeaders.java | 11 +++++++---- .../springframework/http/HttpHeadersTests.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/ReadOnlyHttpHeaders.java b/spring-web/src/main/java/org/springframework/http/ReadOnlyHttpHeaders.java index a6e52face5..ff129f7a0c 100644 --- a/spring-web/src/main/java/org/springframework/http/ReadOnlyHttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/ReadOnlyHttpHeaders.java @@ -16,9 +16,10 @@ package org.springframework.http; -import java.util.AbstractMap; +import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Collection; import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -31,6 +32,7 @@ import org.springframework.util.MultiValueMap; * {@code HttpHeaders} object that can only be read, not written to. * * @author Brian Clozel + * @author Sam Brannen * @since 5.1.1 */ class ReadOnlyHttpHeaders extends HttpHeaders { @@ -141,9 +143,10 @@ class ReadOnlyHttpHeaders extends HttpHeaders { @Override public Set>> entrySet() { - return Collections.unmodifiableSet(this.headers.entrySet().stream() - .map(AbstractMap.SimpleImmutableEntry::new) - .collect(Collectors.toSet())); + return this.headers.entrySet().stream().map(SimpleImmutableEntry::new) + .collect(Collectors.collectingAndThen( + Collectors.toCollection(LinkedHashSet::new), // Retain original ordering of entries + Collections::unmodifiableSet)); } } diff --git a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java index 45ae742e2d..bb32e873bc 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -32,6 +32,7 @@ import java.util.EnumSet; import java.util.GregorianCalendar; import java.util.List; import java.util.Locale; +import java.util.Map.Entry; import java.util.TimeZone; import org.hamcrest.Matchers; @@ -47,6 +48,7 @@ import static org.junit.Assert.*; * @author Sebastien Deleuze * @author Brian Clozel * @author Juergen Hoeller + * @author Sam Brannen */ public class HttpHeadersTests { @@ -557,4 +559,20 @@ public class HttpHeadersTests { assertEquals("Bearer foo", authorization); } + @Test + public void readOnlyHttpHeadersRetainEntrySetOrder() { + headers.add("aardvark", "enigma"); + headers.add("beaver", "enigma"); + headers.add("cat", "enigma"); + headers.add("dog", "enigma"); + headers.add("elephant", "enigma"); + + String[] expectedKeys = new String[] { "aardvark", "beaver", "cat", "dog", "elephant" }; + + assertArrayEquals(expectedKeys, headers.entrySet().stream().map(Entry::getKey).toArray()); + + HttpHeaders readOnlyHttpHeaders = HttpHeaders.readOnlyHttpHeaders(headers); + assertArrayEquals(expectedKeys, readOnlyHttpHeaders.entrySet().stream().map(Entry::getKey).toArray()); + } + }