From 4d5b0c91a30d51f299cd828a87eb9231405098ce Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Mon, 3 Oct 2022 17:23:02 +0100 Subject: [PATCH] Polishing contribution Closes gh-29247 --- .../client/reactive/Netty5HeadersAdapter.java | 49 +++++++------------ .../server/reactive/Netty5HeadersAdapter.java | 45 ++++++----------- .../ReactorNetty2ServerHttpRequest.java | 6 +-- .../client/ReactorNetty2WebSocketClient.java | 7 +-- 4 files changed, 37 insertions(+), 70 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/Netty5HeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/client/reactive/Netty5HeadersAdapter.java index 84784301b86..7bf25d2cfd7 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/Netty5HeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/Netty5HeadersAdapter.java @@ -19,12 +19,11 @@ package org.springframework.http.client.reactive; import java.util.AbstractSet; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.Spliterator; -import java.util.Spliterators; import java.util.stream.StreamSupport; import io.netty5.handler.codec.http.headers.HttpHeaders; @@ -38,7 +37,7 @@ import org.springframework.util.MultiValueMap; * *

There is a duplicate of this class in the server package! * - * This class is based on {@link NettyHeadersAdapter}. + *

This class is based on {@link NettyHeadersAdapter}. * * @author Violeta Georgieva * @since 6.0 @@ -57,7 +56,7 @@ class Netty5HeadersAdapter implements MultiValueMap { @Nullable public String getFirst(String key) { CharSequence value = this.headers.get(key); - return value != null ? value.toString() : null; + return (value != null ? value.toString() : null); } @Override @@ -117,17 +116,19 @@ class Netty5HeadersAdapter implements MultiValueMap { @Override public boolean containsValue(Object value) { - return (value instanceof String && - StreamSupport.stream( - Spliterators.spliteratorUnknownSize(this.headers.iterator(), Spliterator.ORDERED), false) + return (value instanceof CharSequence && + StreamSupport.stream(this.headers.spliterator(), false) .anyMatch(entry -> value.equals(entry.getValue()))); } @Override @Nullable public List get(Object key) { - if (containsKey(key)) { - return getAll(this.headers.valuesIterator((CharSequence) key)); + Iterator iterator = this.headers.valuesIterator((CharSequence) key); + if (iterator.hasNext()) { + List result = new ArrayList<>(); + iterator.forEachRemaining(value -> result.add(value.toString())); + return result; } return null; } @@ -135,7 +136,7 @@ class Netty5HeadersAdapter implements MultiValueMap { @Nullable @Override public List put(String key, @Nullable List value) { - List previousValues = getAll(this.headers.valuesIterator(key)); + List previousValues = get(key); this.headers.set(key, value); return previousValues; } @@ -144,7 +145,7 @@ class Netty5HeadersAdapter implements MultiValueMap { @Override public List remove(Object key) { if (key instanceof String headerName) { - List previousValues = getAll(this.headers.valuesIterator(headerName)); + List previousValues = get(headerName); this.headers.remove(headerName); return previousValues; } @@ -168,8 +169,9 @@ class Netty5HeadersAdapter implements MultiValueMap { @Override public Collection> values() { - return this.headers.names().stream() - .map(key -> getAll(this.headers.valuesIterator(key))).toList(); + List> result = new ArrayList<>(this.headers.size()); + forEach((key, value) -> result.add(value)); + return result; } @Override @@ -194,19 +196,6 @@ class Netty5HeadersAdapter implements MultiValueMap { } - @Nullable - private static List getAll(Iterator valuesIterator) { - if (!valuesIterator.hasNext()) { - return null; - } - List result = new ArrayList<>(); - while (valuesIterator.hasNext()) { - result.add(valuesIterator.next().toString()); - } - return result; - } - - private class EntryIterator implements Iterator>> { private final Iterator names = headers.names().iterator(); @@ -238,12 +227,8 @@ class Netty5HeadersAdapter implements MultiValueMap { @Override public List getValue() { - List result = new ArrayList<>(); - Iterator valuesIterator = headers.valuesIterator(this.key); - while (valuesIterator.hasNext()) { - result.add(valuesIterator.next().toString()); - } - return result; + List values = get(this.key); + return (values != null ? values : Collections.emptyList()); } @Override diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/Netty5HeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/Netty5HeadersAdapter.java index 1d5fc7d610a..35714334a1d 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/Netty5HeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/Netty5HeadersAdapter.java @@ -19,12 +19,11 @@ package org.springframework.http.server.reactive; import java.util.AbstractSet; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.Spliterator; -import java.util.Spliterators; import java.util.stream.StreamSupport; import io.netty5.handler.codec.http.headers.HttpHeaders; @@ -55,7 +54,7 @@ final class Netty5HeadersAdapter implements MultiValueMap { @Nullable public String getFirst(String key) { CharSequence value = this.headers.get(key); - return value != null ? value.toString() : null; + return (value != null ? value.toString() : null); } @Override @@ -116,16 +115,18 @@ final class Netty5HeadersAdapter implements MultiValueMap { @Override public boolean containsValue(Object value) { return (value instanceof String && - StreamSupport.stream( - Spliterators.spliteratorUnknownSize(this.headers.iterator(), Spliterator.ORDERED), false) + StreamSupport.stream(this.headers.spliterator(), false) .anyMatch(entry -> value.equals(entry.getValue()))); } @Override @Nullable public List get(Object key) { - if (containsKey(key)) { - return getAll(this.headers.valuesIterator((CharSequence) key)); + Iterator iterator = this.headers.valuesIterator((CharSequence) key); + if (iterator.hasNext()) { + List result = new ArrayList<>(); + iterator.forEachRemaining(value -> result.add(value.toString())); + return result; } return null; } @@ -133,7 +134,7 @@ final class Netty5HeadersAdapter implements MultiValueMap { @Nullable @Override public List put(String key, @Nullable List value) { - List previousValues = getAll(this.headers.valuesIterator(key)); + List previousValues = get(key); this.headers.set(key, value); return previousValues; } @@ -142,7 +143,7 @@ final class Netty5HeadersAdapter implements MultiValueMap { @Override public List remove(Object key) { if (key instanceof String headerName) { - List previousValues = getAll(this.headers.valuesIterator(headerName)); + List previousValues = get(headerName); this.headers.remove(headerName); return previousValues; } @@ -166,8 +167,9 @@ final class Netty5HeadersAdapter implements MultiValueMap { @Override public Collection> values() { - return this.headers.names().stream() - .map(key -> getAll(this.headers.valuesIterator(key))).toList(); + List> result = new ArrayList<>(this.headers.size()); + forEach((key, value) -> result.add(value)); + return result; } @Override @@ -192,19 +194,6 @@ final class Netty5HeadersAdapter implements MultiValueMap { } - @Nullable - private static List getAll(Iterator valuesIterator) { - if (!valuesIterator.hasNext()) { - return null; - } - List result = new ArrayList<>(); - while (valuesIterator.hasNext()) { - result.add(valuesIterator.next().toString()); - } - return result; - } - - private class EntryIterator implements Iterator>> { private final Iterator names = headers.names().iterator(); @@ -236,12 +225,8 @@ final class Netty5HeadersAdapter implements MultiValueMap { @Override public List getValue() { - List result = new ArrayList<>(); - Iterator valuesIterator = headers.valuesIterator(this.key); - while (valuesIterator.hasNext()) { - result.add(valuesIterator.next().toString()); - } - return result; + List values = get(this.key); + return (values != null ? values : Collections.emptyList()); } @Override diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorNetty2ServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorNetty2ServerHttpRequest.java index 7f643330502..67b8fa02e4c 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorNetty2ServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorNetty2ServerHttpRequest.java @@ -80,9 +80,9 @@ class ReactorNetty2ServerHttpRequest extends AbstractServerHttpRequest { private static URI resolveBaseUrl(HttpServerRequest request) throws URISyntaxException { String scheme = getScheme(request); - CharSequence headerCS = request.requestHeaders().get(HttpHeaderNames.HOST); - if (headerCS != null) { - String header = headerCS.toString(); + CharSequence charSequence = request.requestHeaders().get(HttpHeaderNames.HOST); + if (charSequence != null) { + String header = charSequence.toString(); final int portIndex; if (header.startsWith("[")) { portIndex = header.indexOf(':', header.indexOf(']')); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/ReactorNetty2WebSocketClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/ReactorNetty2WebSocketClient.java index 0db51916d9e..beaf75a3927 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/ReactorNetty2WebSocketClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/client/ReactorNetty2WebSocketClient.java @@ -157,11 +157,8 @@ public class ReactorNetty2WebSocketClient implements WebSocketClient { private HttpHeaders toHttpHeaders(WebsocketInbound inbound) { HttpHeaders headers = new HttpHeaders(); - io.netty5.handler.codec.http.headers.HttpHeaders nettyHeaders = inbound.headers(); - nettyHeaders.forEach(entry -> { - CharSequence name = entry.getKey(); - headers.put(name.toString(), getAll(nettyHeaders.valuesIterator(name))); - }); + inbound.headers().iterator().forEachRemaining(entry -> + headers.add(entry.getKey().toString(), entry.getValue().toString())); return headers; }