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
This commit is contained in:
Rossen Stoyanchev 2021-09-17 12:50:10 +01:00
parent cce61c3918
commit b732ff3495
2 changed files with 12 additions and 33 deletions

View File

@ -44,10 +44,10 @@ import org.springframework.util.MultiValueMap;
*/ */
class JettyHeadersAdapter implements MultiValueMap<String, String> { class JettyHeadersAdapter implements MultiValueMap<String, String> {
private final HttpFields headers; private final HttpFields.Mutable headers;
JettyHeadersAdapter(HttpFields headers) { JettyHeadersAdapter(HttpFields.Mutable headers) {
this.headers = headers; this.headers = headers;
} }
@ -59,10 +59,7 @@ class JettyHeadersAdapter implements MultiValueMap<String, String> {
@Override @Override
public void add(String key, @Nullable String value) { public void add(String key, @Nullable String value) {
if (!(this.headers instanceof HttpFields.Mutable)) { this.headers.add(key, value);
throw new IllegalStateException("Immutable headers");
}
((HttpFields.Mutable) this.headers).add(key, value);
} }
@Override @Override
@ -77,10 +74,7 @@ class JettyHeadersAdapter implements MultiValueMap<String, String> {
@Override @Override
public void set(String key, @Nullable String value) { public void set(String key, @Nullable String value) {
if (!(this.headers instanceof HttpFields.Mutable)) { this.headers.put(key, value);
throw new IllegalStateException("Immutable headers");
}
((HttpFields.Mutable) this.headers).put(key, value);
} }
@Override @Override
@ -133,23 +127,17 @@ class JettyHeadersAdapter implements MultiValueMap<String, String> {
@Nullable @Nullable
@Override @Override
public List<String> put(String key, List<String> value) { public List<String> put(String key, List<String> value) {
if (!(this.headers instanceof HttpFields.Mutable)) {
throw new IllegalStateException("Immutable headers");
}
List<String> oldValues = get(key); List<String> oldValues = get(key);
((HttpFields.Mutable) this.headers).put(key, value); this.headers.put(key, value);
return oldValues; return oldValues;
} }
@Nullable @Nullable
@Override @Override
public List<String> remove(Object key) { public List<String> remove(Object key) {
if (!(this.headers instanceof HttpFields.Mutable)) {
throw new IllegalStateException("Immutable headers");
}
if (key instanceof String) { if (key instanceof String) {
List<String> oldValues = get(key); List<String> oldValues = get(key);
((HttpFields.Mutable) this.headers).remove((String) key); this.headers.remove((String) key);
return oldValues; return oldValues;
} }
return null; return null;
@ -162,10 +150,7 @@ class JettyHeadersAdapter implements MultiValueMap<String, String> {
@Override @Override
public void clear() { public void clear() {
if (!(this.headers instanceof HttpFields.Mutable)) { this.headers.clear();
throw new IllegalStateException("Immutable headers");
}
((HttpFields.Mutable) this.headers).clear();
} }
@Override @Override
@ -181,7 +166,7 @@ class JettyHeadersAdapter implements MultiValueMap<String, String> {
@Override @Override
public Set<Entry<String, List<String>>> entrySet() { public Set<Entry<String, List<String>>> entrySet() {
return new AbstractSet<Entry<String, List<String>>>() { return new AbstractSet<>() {
@Override @Override
public Iterator<Entry<String, List<String>>> iterator() { public Iterator<Entry<String, List<String>>> iterator() {
return new EntryIterator(); return new EntryIterator();
@ -237,11 +222,8 @@ class JettyHeadersAdapter implements MultiValueMap<String, String> {
@Override @Override
public List<String> setValue(List<String> value) { public List<String> setValue(List<String> value) {
if (!(headers instanceof HttpFields.Mutable)) {
throw new IllegalStateException("Immutable headers");
}
List<String> previousValues = headers.getValuesList(this.key); List<String> previousValues = headers.getValuesList(this.key);
((HttpFields.Mutable) headers).put(this.key, value); headers.put(this.key, value);
return previousValues; return previousValues;
} }
} }
@ -285,16 +267,13 @@ class JettyHeadersAdapter implements MultiValueMap<String, String> {
@Override @Override
public void remove() { public void remove() {
if (!(headers instanceof HttpFields.Mutable)) {
throw new IllegalStateException("Immutable headers");
}
if (this.currentName == null) { if (this.currentName == null) {
throw new IllegalStateException("No current Header in iterator"); throw new IllegalStateException("No current Header in iterator");
} }
if (!headers.contains(this.currentName)) { if (!headers.contains(this.currentName)) {
throw new IllegalStateException("Header not present: " + this.currentName); throw new IllegalStateException("Header not present: " + this.currentName);
} }
((HttpFields.Mutable) headers).remove(this.currentName); headers.remove(this.currentName);
} }
} }

View File

@ -84,7 +84,7 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
private static MultiValueMap<String, String> createHeaders(HttpServletRequest servletRequest) { private static MultiValueMap<String, String> createHeaders(HttpServletRequest servletRequest) {
Request request = getRequest(servletRequest); Request request = getRequest(servletRequest);
HttpFields fields = request.getMetaData().getFields(); HttpFields.Mutable fields = HttpFields.build(request.getHttpFields());
return new JettyHeadersAdapter(fields); return new JettyHeadersAdapter(fields);
} }
@ -116,7 +116,7 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
private static HttpHeaders createHeaders(HttpServletResponse servletResponse) { private static HttpHeaders createHeaders(HttpServletResponse servletResponse) {
Response response = getResponse(servletResponse); Response response = getResponse(servletResponse);
HttpFields fields = response.getHttpFields(); HttpFields.Mutable fields = response.getHttpFields();
return new HttpHeaders(new JettyHeadersAdapter(fields)); return new HttpHeaders(new JettyHeadersAdapter(fields));
} }