Adds support for multiple headers with the same name.

Fixes gh-1775
Fixes gh-1776
This commit is contained in:
Lyth
2020-06-12 19:54:03 +02:00
committed by spencergibb
parent 1f00f23e0d
commit 001c74dcb6
2 changed files with 46 additions and 8 deletions

View File

@@ -18,11 +18,13 @@ package org.springframework.cloud.gateway.filter.factory;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import reactor.core.publisher.Mono;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.http.HttpHeaders;
import org.springframework.web.server.ServerWebExchange;
import static org.springframework.cloud.gateway.support.GatewayToStringStyler.filterToStringCreator;
@@ -59,7 +61,7 @@ public class RewriteResponseHeaderGatewayFilterFactory extends
public Mono<Void> filter(ServerWebExchange exchange,
GatewayFilterChain chain) {
return chain.filter(exchange)
.then(Mono.fromRunnable(() -> rewriteHeader(exchange, config)));
.then(Mono.fromRunnable(() -> rewriteHeaders(exchange, config)));
}
@Override
@@ -74,15 +76,21 @@ public class RewriteResponseHeaderGatewayFilterFactory extends
};
}
@Deprecated
protected void rewriteHeader(ServerWebExchange exchange, Config config) {
rewriteHeaders(exchange, config);
}
protected void rewriteHeaders(ServerWebExchange exchange, Config config) {
final String name = config.getName();
final String value = exchange.getResponse().getHeaders().getFirst(name);
if (value == null) {
return;
}
final String newValue = rewrite(value, config.getRegexp(),
config.getReplacement());
exchange.getResponse().getHeaders().set(name, newValue);
final HttpHeaders responseHeaders = exchange.getResponse().getHeaders();
responseHeaders.computeIfPresent(name, (k, v) -> rewriteHeaders(config, v));
}
protected List<String> rewriteHeaders(Config config, List<String> headers) {
return headers.stream()
.map(val -> rewrite(val, config.getRegexp(), config.getReplacement()))
.collect(Collectors.toList());
}
String rewrite(String value, String regexp, String replacement) {

View File

@@ -16,13 +16,21 @@
package org.springframework.cloud.gateway.filter.factory;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.RewriteResponseHeaderGatewayFilterFactory.Config;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.springframework.http.HttpHeaders.SET_COOKIE;
public class RewriteResponseHeaderGatewayFilterFactoryUnitTests {
@@ -45,6 +53,28 @@ public class RewriteResponseHeaderGatewayFilterFactoryUnitTests {
.isEqualTo("/foo/cafe/wat/cafe");
}
@Test
public void testRewriteMultipleHeaders() {
Config config = new Config();
config.setName(SET_COOKIE);
config.setRegexp("SameSite[^;]+");
config.setReplacement("SameSite=Strict");
ServerWebExchange exchange = mock(ServerWebExchange.class);
ServerHttpResponse response = mock(ServerHttpResponse.class);
HttpHeaders headers = new HttpHeaders();
headers.add(SET_COOKIE, "TestCookie=Value;SameSite=Lax");
headers.add(SET_COOKIE, "OtherCookie=Value;SameSite=Lax");
when(response.getHeaders()).thenReturn(headers);
when(exchange.getResponse()).thenReturn(response);
filterFactory.rewriteHeaders(exchange, config);
List<String> actualHeaders = headers.get(SET_COOKIE);
assertThat(actualHeaders).isNotNull();
assertThat(actualHeaders).containsExactly("TestCookie=Value;SameSite=Strict",
"OtherCookie=Value;SameSite=Strict");
}
@Test
public void toStringFormat() {
Config config = new Config();