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> {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue