Skip to content

Commit 66abd43

Browse files
authored
Added removal of Connection option headers. Fixes GH-2653 (#3314)
1 parent ea3662d commit 66abd43

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/headers/RemoveHopByHopHeadersFilter.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Map;
2323
import java.util.Set;
2424
import java.util.stream.Collectors;
25+
import java.util.stream.Stream;
2526

2627
import org.springframework.boot.context.properties.ConfigurationProperties;
2728
import org.springframework.core.Ordered;
@@ -67,11 +68,17 @@ public void setOrder(int order) {
6768
}
6869

6970
@Override
70-
public HttpHeaders filter(HttpHeaders input, ServerWebExchange exchange) {
71+
public HttpHeaders filter(HttpHeaders originalHeaders, ServerWebExchange exchange) {
7172
HttpHeaders filtered = new HttpHeaders();
72-
73-
for (Map.Entry<String, List<String>> entry : input.entrySet()) {
74-
if (!this.headers.contains(entry.getKey().toLowerCase())) {
73+
List<String> connectionOptions = originalHeaders.getConnection()
74+
.stream()
75+
.map(String::toLowerCase)
76+
.toList();
77+
Set<String> headersToRemove = Stream.concat(headers.stream(), connectionOptions.stream())
78+
.collect(Collectors.toSet());
79+
80+
for (Map.Entry<String, List<String>> entry : originalHeaders.entrySet()) {
81+
if (!headersToRemove.contains(entry.getKey().toLowerCase())) {
7582
filtered.addAll(entry.getKey(), entry.getValue());
7683
}
7784
}

spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/headers/RemoveHopByHopHeadersFilterTests.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.util.StringUtils;
3030

3131
import static org.assertj.core.api.Assertions.assertThat;
32+
import static org.assertj.core.api.Assumptions.assumeThat;
3233
import static org.springframework.cloud.gateway.filter.headers.RemoveHopByHopHeadersFilter.HEADERS_REMOVED_ON_REQUEST;
3334

3435
/**
@@ -75,11 +76,14 @@ public void caseInsensitiveCustom() {
7576
public void removesHeadersListedInConnectionHeader() {
7677
MockServerHttpRequest.BaseBuilder<?> builder = MockServerHttpRequest.get("http://localhost/get");
7778

78-
builder.header(HttpHeaders.CONNECTION, "upgrade", "keep-alive");
79+
String arbitraryConnectionOption = "xyz";
80+
assumeThat(HEADERS_REMOVED_ON_REQUEST).doesNotContain(arbitraryConnectionOption);
81+
builder.header(HttpHeaders.CONNECTION, "upgrade", "keep-alive", arbitraryConnectionOption.toUpperCase());
7982
builder.header(HttpHeaders.UPGRADE, "WebSocket");
80-
builder.header("Keep-Alive", "timeout:5");
83+
builder.header("Keep-Alive", "timeout=5");
84+
builder.header(arbitraryConnectionOption, "");
8185

82-
testFilter(MockServerWebExchange.from(builder), "upgrade", "keep-alive");
86+
testFilter(MockServerWebExchange.from(builder), arbitraryConnectionOption);
8387
}
8488

8589
private void testFilter(MockServerWebExchange exchange, String... additionalHeaders) {

0 commit comments

Comments
 (0)