diff --git a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java index fa37ec81f5f..f86929971cc 100644 --- a/spring-web/src/main/java/org/springframework/http/HttpHeaders.java +++ b/spring-web/src/main/java/org/springframework/http/HttpHeaders.java @@ -2188,6 +2188,7 @@ public class HttpHeaders implements Serializable { private static final Object VALUE = new Object(); private final MultiValueMap headers; + private final Map deduplicatedNames; public CaseInsensitiveHeaderNameSet(MultiValueMap headers) { @@ -2229,13 +2230,15 @@ public class HttpHeaders implements Serializable { } } - private static class HeaderNamesIterator implements Iterator { - private @Nullable String currentName; + private static class HeaderNamesIterator implements Iterator { private final MultiValueMap headers; + private final Iterator namesIterator; + private @Nullable String currentName; + public HeaderNamesIterator(MultiValueMap headers, Map caseInsensitiveNames) { this.headers = headers; this.namesIterator = caseInsensitiveNames.keySet().iterator(); @@ -2269,6 +2272,7 @@ public class HttpHeaders implements Serializable { private static final class CaseInsensitiveEntrySet extends AbstractSet>> { private final MultiValueMap headers; + private final CaseInsensitiveHeaderNameSet nameSet; public CaseInsensitiveEntrySet(MultiValueMap headers) { @@ -2286,6 +2290,7 @@ public class HttpHeaders implements Serializable { return this.nameSet.size(); } + private final class CaseInsensitiveIterator implements Iterator>> { private final Iterator namesIterator; @@ -2310,6 +2315,7 @@ public class HttpHeaders implements Serializable { } } + private final class CaseInsensitiveEntry implements Entry> { private final String key; @@ -2330,26 +2336,21 @@ public class HttpHeaders implements Serializable { @Override public List setValue(List value) { - List previousValues = Objects.requireNonNull( - CaseInsensitiveEntrySet.this.headers.get(this.key)); + List previousValues = Objects.requireNonNull(CaseInsensitiveEntrySet.this.headers.get(this.key)); CaseInsensitiveEntrySet.this.headers.put(this.key, value); return previousValues; } @Override - public boolean equals(@Nullable Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Map.Entry that)) { - return false; - } - return ObjectUtils.nullSafeEquals(getKey(), that.getKey()) && ObjectUtils.nullSafeEquals(getValue(), that.getValue()); + public boolean equals(@Nullable Object other) { + return (this == other || (other instanceof Map.Entry that && + ObjectUtils.nullSafeEquals(getKey(), that.getKey()) && + ObjectUtils.nullSafeEquals(getValue(), that.getValue()))); } @Override public int hashCode() { - return ObjectUtils.nullSafeHash(getKey(), getValue()); + return this.key.hashCode(); // avoid value lookup for hashCode } } } diff --git a/spring-web/src/main/java/org/springframework/http/support/JettyHeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/support/JettyHeadersAdapter.java index 054a7a7b0e5..0c01cb20dca 100644 --- a/spring-web/src/main/java/org/springframework/http/support/JettyHeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/support/JettyHeadersAdapter.java @@ -52,14 +52,14 @@ public final class JettyHeadersAdapter implements MultiValueMap /** - * Creates a new {@code JettyHeadersAdapter} based on the given + * Construct a new {@code JettyHeadersAdapter} based on the given * {@code HttpFields} instance. * @param headers the {@code HttpFields} to base this adapter on */ public JettyHeadersAdapter(HttpFields headers) { Assert.notNull(headers, "Headers must not be null"); this.headers = headers; - this.mutable = headers instanceof HttpFields.Mutable m ? m : null; + this.mutable = (headers instanceof HttpFields.Mutable m ? m : null); } @@ -146,12 +146,12 @@ public final class JettyHeadersAdapter implements MultiValueMap public @Nullable List get(Object key) { List list = null; if (key instanceof String name) { - for (HttpField f : this.headers) { - if (f.is(name)) { + for (HttpField field : this.headers) { + if (field.is(name)) { if (list == null) { list = new ArrayList<>(); } - list.add(f.getValue()); + list.add(field.getValue()); } } } @@ -162,7 +162,6 @@ public final class JettyHeadersAdapter implements MultiValueMap public @Nullable List put(String key, List value) { HttpFields.Mutable mutableHttpFields = mutableFields(); List oldValues = get(key); - if (oldValues == null) { switch (value.size()) { case 0 -> {}