From 7f648e372801c283e2789ca1c110584b2037737b Mon Sep 17 00:00:00 2001 From: sokomishalov Date: Mon, 10 Jan 2022 11:51:55 +0300 Subject: [PATCH] expose `initReadOnlyHeaders` in `AbstractClientHttpRequest` --- .../reactive/AbstractClientHttpRequest.java | 11 ++++-- .../HttpComponentsClientHttpRequest.java | 5 +++ .../HttpComponentsHeadersAdapter.java | 36 +++++++++---------- .../reactive/JettyClientHttpRequest.java | 4 +++ .../reactive/ReactorClientHttpRequest.java | 6 ++++ 5 files changed, 42 insertions(+), 20 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java index 8734521f0486..d1e67ae9c4c1 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java @@ -74,14 +74,13 @@ public AbstractClientHttpRequest(HttpHeaders headers) { this.cookies = new LinkedMultiValueMap<>(); } - @Override public HttpHeaders getHeaders() { if (this.readOnlyHeaders != null) { return this.readOnlyHeaders; } else if (State.COMMITTED.equals(this.state.get())) { - this.readOnlyHeaders = HttpHeaders.readOnlyHttpHeaders(this.headers); + this.readOnlyHeaders = initReadOnlyHeaders(); return this.readOnlyHeaders; } else { @@ -144,6 +143,14 @@ protected Mono doCommit(@Nullable Supplier> writ return Flux.concat(actions).then(); } + /** + * Initialize read-only headers with underlying request headers. + * @return read-only headers + */ + protected HttpHeaders initReadOnlyHeaders() { + return HttpHeaders.readOnlyHttpHeaders(this.headers); + } + /** * Apply header changes from {@link #getHeaders()} to the underlying request. diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/HttpComponentsClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/reactive/HttpComponentsClientHttpRequest.java index 40c6af39b589..b4d4b552befd 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/HttpComponentsClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/HttpComponentsClientHttpRequest.java @@ -115,6 +115,11 @@ public Mono setComplete() { return doCommit(); } + @Override + protected HttpHeaders initReadOnlyHeaders() { + return HttpHeaders.readOnlyHttpHeaders(new HttpComponentsHeadersAdapter(this.httpRequest)); + } + @Override protected void applyHeaders() { HttpHeaders headers = getHeaders(); diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/HttpComponentsHeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/client/reactive/HttpComponentsHeadersAdapter.java index 9b914c1a4e21..2b6a855dc3d1 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/HttpComponentsHeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/HttpComponentsHeadersAdapter.java @@ -28,7 +28,7 @@ import java.util.Set; import org.apache.hc.core5.http.Header; -import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.HttpMessage; import org.springframework.http.HttpHeaders; import org.springframework.lang.Nullable; @@ -44,23 +44,23 @@ */ class HttpComponentsHeadersAdapter implements MultiValueMap { - private final HttpResponse response; + private final HttpMessage message; - HttpComponentsHeadersAdapter(HttpResponse response) { - this.response = response; + HttpComponentsHeadersAdapter(HttpMessage message) { + this.message = message; } @Override public String getFirst(String key) { - Header header = this.response.getFirstHeader(key); + Header header = this.message.getFirstHeader(key); return (header != null ? header.getValue() : null); } @Override public void add(String key, @Nullable String value) { - this.response.addHeader(key, value); + this.message.addHeader(key, value); } @Override @@ -75,7 +75,7 @@ public void addAll(MultiValueMap values) { @Override public void set(String key, @Nullable String value) { - this.response.setHeader(key, value); + this.message.setHeader(key, value); } @Override @@ -86,29 +86,29 @@ public void setAll(Map values) { @Override public Map toSingleValueMap() { Map map = CollectionUtils.newLinkedHashMap(size()); - this.response.headerIterator().forEachRemaining(h -> map.putIfAbsent(h.getName(), h.getValue())); + this.message.headerIterator().forEachRemaining(h -> map.putIfAbsent(h.getName(), h.getValue())); return map; } @Override public int size() { - return this.response.getHeaders().length; + return this.message.getHeaders().length; } @Override public boolean isEmpty() { - return (this.response.getHeaders().length == 0); + return (this.message.getHeaders().length == 0); } @Override public boolean containsKey(Object key) { - return (key instanceof String headerName && this.response.containsHeader(headerName)); + return (key instanceof String headerName && this.message.containsHeader(headerName)); } @Override public boolean containsValue(Object value) { return (value instanceof String && - Arrays.stream(this.response.getHeaders()).anyMatch(h -> h.getValue().equals(value))); + Arrays.stream(this.message.getHeaders()).anyMatch(h -> h.getValue().equals(value))); } @Nullable @@ -116,7 +116,7 @@ public boolean containsValue(Object value) { public List get(Object key) { List values = null; if (containsKey(key)) { - Header[] headers = this.response.getHeaders((String) key); + Header[] headers = this.message.getHeaders((String) key); values = new ArrayList<>(headers.length); for (Header header : headers) { values.add(header.getValue()); @@ -138,7 +138,7 @@ public List put(String key, List values) { public List remove(Object key) { if (key instanceof String headerName) { List oldValues = get(key); - this.response.removeHeaders(headerName); + this.message.removeHeaders(headerName); return oldValues; } return null; @@ -151,13 +151,13 @@ public void putAll(Map> map) { @Override public void clear() { - this.response.setHeaders(); + this.message.setHeaders(); } @Override public Set keySet() { Set keys = new LinkedHashSet<>(size()); - for (Header header : this.response.getHeaders()) { + for (Header header : this.message.getHeaders()) { keys.add(header.getName()); } return keys; @@ -166,7 +166,7 @@ public Set keySet() { @Override public Collection> values() { Collection> values = new ArrayList<>(size()); - for (Header header : this.response.getHeaders()) { + for (Header header : this.message.getHeaders()) { values.add(get(header.getName())); } return values; @@ -196,7 +196,7 @@ public String toString() { private class EntryIterator implements Iterator>> { - private final Iterator
iterator = response.headerIterator(); + private final Iterator
iterator = message.headerIterator(); @Override public boolean hasNext() { diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/JettyClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/reactive/JettyClientHttpRequest.java index 80ad419ef499..6f8758f4bd5f 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/JettyClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/JettyClientHttpRequest.java @@ -125,6 +125,10 @@ public void failed(Throwable t) { }); } + @Override + protected HttpHeaders initReadOnlyHeaders() { + return HttpHeaders.readOnlyHttpHeaders(new JettyHeadersAdapter(this.jettyRequest.getHeaders())); + } @Override protected void applyCookies() { diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java index f098f8594ba3..836b4b7b17df 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java @@ -31,6 +31,7 @@ import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.NettyDataBufferFactory; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ZeroCopyHttpOutputMessage; @@ -121,6 +122,11 @@ public Mono setComplete() { return doCommit(this.outbound::then); } + @Override + protected HttpHeaders initReadOnlyHeaders() { + return HttpHeaders.readOnlyHttpHeaders(new NettyHeadersAdapter(this.request.requestHeaders())); + } + @Override protected void applyHeaders() { getHeaders().forEach((key, value) -> this.request.requestHeaders().set(key, value));