Browse Source

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
pull/27435/head
Rossen Stoyanchev 4 years ago
parent
commit
b732ff3495
  1. 41
      spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java
  2. 4
      spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java

41
spring-web/src/main/java/org/springframework/http/server/reactive/JettyHeadersAdapter.java

@ -44,10 +44,10 @@ import org.springframework.util.MultiValueMap; @@ -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> { @@ -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> { @@ -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> { @@ -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> { @@ -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> { @@ -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> { @@ -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> { @@ -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);
}
}

4
spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java

@ -84,7 +84,7 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter { @@ -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 { @@ -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…
Cancel
Save