From b732ff349509d2b174978c71fe522ee6aa6b57a8 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 17 Sep 2021 12:50:10 +0100 Subject: [PATCH] Ensure mutable headers for Jetty WebFlux request In Jetty 10, request headers are immutable, see https://github.com/eclipse/jetty.project/pull/4777, but we need to remove/hide forwarded headers when they have been used. See gh-27424 --- .../server/reactive/JettyHeadersAdapter.java | 41 +++++-------------- .../reactive/JettyHttpHandlerAdapter.java | 4 +- 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java index b8d73163ce..3e6700cf4e 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java @@ -44,10 +44,10 @@ import org.springframework.util.MultiValueMap; */ class JettyHeadersAdapter implements MultiValueMap { - private final HttpFields headers; + private final HttpFields.Mutable headers; - JettyHeadersAdapter(HttpFields headers) { + JettyHeadersAdapter(HttpFields.Mutable headers) { this.headers = headers; } @@ -59,10 +59,7 @@ class JettyHeadersAdapter implements MultiValueMap { @Override public void add(String key, @Nullable String value) { - if (!(this.headers instanceof HttpFields.Mutable)) { - throw new IllegalStateException("Immutable headers"); - } - ((HttpFields.Mutable) this.headers).add(key, value); + this.headers.add(key, value); } @Override @@ -77,10 +74,7 @@ class JettyHeadersAdapter implements MultiValueMap { @Override public void set(String key, @Nullable String value) { - if (!(this.headers instanceof HttpFields.Mutable)) { - throw new IllegalStateException("Immutable headers"); - } - ((HttpFields.Mutable) this.headers).put(key, value); + this.headers.put(key, value); } @Override @@ -133,23 +127,17 @@ class JettyHeadersAdapter implements MultiValueMap { @Nullable @Override public List put(String key, List value) { - if (!(this.headers instanceof HttpFields.Mutable)) { - throw new IllegalStateException("Immutable headers"); - } List oldValues = get(key); - ((HttpFields.Mutable) this.headers).put(key, value); + this.headers.put(key, value); return oldValues; } @Nullable @Override public List remove(Object key) { - if (!(this.headers instanceof HttpFields.Mutable)) { - throw new IllegalStateException("Immutable headers"); - } if (key instanceof String) { List oldValues = get(key); - ((HttpFields.Mutable) this.headers).remove((String) key); + this.headers.remove((String) key); return oldValues; } return null; @@ -162,10 +150,7 @@ class JettyHeadersAdapter implements MultiValueMap { @Override public void clear() { - if (!(this.headers instanceof HttpFields.Mutable)) { - throw new IllegalStateException("Immutable headers"); - } - ((HttpFields.Mutable) this.headers).clear(); + this.headers.clear(); } @Override @@ -181,7 +166,7 @@ class JettyHeadersAdapter implements MultiValueMap { @Override public Set>> entrySet() { - return new AbstractSet>>() { + return new AbstractSet<>() { @Override public Iterator>> iterator() { return new EntryIterator(); @@ -237,11 +222,8 @@ class JettyHeadersAdapter implements MultiValueMap { @Override public List setValue(List value) { - if (!(headers instanceof HttpFields.Mutable)) { - throw new IllegalStateException("Immutable headers"); - } List previousValues = headers.getValuesList(this.key); - ((HttpFields.Mutable) headers).put(this.key, value); + headers.put(this.key, value); return previousValues; } } @@ -285,16 +267,13 @@ class JettyHeadersAdapter implements MultiValueMap { @Override public void remove() { - if (!(headers instanceof HttpFields.Mutable)) { - throw new IllegalStateException("Immutable headers"); - } if (this.currentName == null) { throw new IllegalStateException("No current Header in iterator"); } if (!headers.contains(this.currentName)) { throw new IllegalStateException("Header not present: " + this.currentName); } - ((HttpFields.Mutable) headers).remove(this.currentName); + headers.remove(this.currentName); } } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java index 8f5f23be08..8c1615e6d2 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java @@ -84,7 +84,7 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter { private static MultiValueMap createHeaders(HttpServletRequest servletRequest) { Request request = getRequest(servletRequest); - HttpFields fields = request.getMetaData().getFields(); + HttpFields.Mutable fields = HttpFields.build(request.getHttpFields()); return new JettyHeadersAdapter(fields); } @@ -116,7 +116,7 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter { private static HttpHeaders createHeaders(HttpServletResponse servletResponse) { Response response = getResponse(servletResponse); - HttpFields fields = response.getHttpFields(); + HttpFields.Mutable fields = response.getHttpFields(); return new HttpHeaders(new JettyHeadersAdapter(fields)); }