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:
parent
cce61c3918
commit
b732ff3495
|
@ -44,10 +44,10 @@ import org.springframework.util.MultiValueMap;
|
|||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -59,10 +59,7 @@ class JettyHeadersAdapter implements MultiValueMap<String, String> {
|
|||
|
||||
@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<String, String> {
|
|||
|
||||
@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<String, String> {
|
|||
@Nullable
|
||||
@Override
|
||||
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);
|
||||
((HttpFields.Mutable) this.headers).put(key, value);
|
||||
this.headers.put(key, value);
|
||||
return oldValues;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public List<String> remove(Object key) {
|
||||
if (!(this.headers instanceof HttpFields.Mutable)) {
|
||||
throw new IllegalStateException("Immutable headers");
|
||||
}
|
||||
if (key instanceof String) {
|
||||
List<String> 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<String, String> {
|
|||
|
||||
@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<String, String> {
|
|||
|
||||
@Override
|
||||
public Set<Entry<String, List<String>>> entrySet() {
|
||||
return new AbstractSet<Entry<String, List<String>>>() {
|
||||
return new AbstractSet<>() {
|
||||
@Override
|
||||
public Iterator<Entry<String, List<String>>> iterator() {
|
||||
return new EntryIterator();
|
||||
|
@ -237,11 +222,8 @@ class JettyHeadersAdapter implements MultiValueMap<String, String> {
|
|||
|
||||
@Override
|
||||
public List<String> setValue(List<String> value) {
|
||||
if (!(headers instanceof HttpFields.Mutable)) {
|
||||
throw new IllegalStateException("Immutable headers");
|
||||
}
|
||||
List<String> 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<String, String> {
|
|||
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
|||
|
||||
private static MultiValueMap<String, String> 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));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue