Polish gh-2737
Formatting, added missing copyright and updated DisableBuiltInFiltersTests to include new filter.
This commit is contained in:
@@ -1,3 +1,19 @@
|
||||
/*
|
||||
* Copyright 2013-2022 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.gateway.filter.factory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -20,8 +36,8 @@ import org.springframework.web.server.ServerWebExchange;
|
||||
import static org.springframework.cloud.gateway.support.GatewayToStringStyler.filterToStringCreator;
|
||||
|
||||
/**
|
||||
* Adds one or more headers to the downstream request’s headers without overriding previous values.
|
||||
* If the header is are already present, value(s) will not be set.
|
||||
* Adds one or more headers to the downstream request’s headers without overriding
|
||||
* previous values. If the header is are already present, value(s) will not be set.
|
||||
*
|
||||
* @author Abel Salgado Romero
|
||||
*/
|
||||
@@ -53,9 +69,7 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactory
|
||||
for (Map.Entry<String, List<String>> kv : aggregatedHeaders.entrySet()) {
|
||||
String headerName = kv.getKey();
|
||||
|
||||
boolean headerIsMissingOrBlank = exchange.getRequest().getHeaders()
|
||||
.getOrEmpty(headerName)
|
||||
.stream()
|
||||
boolean headerIsMissingOrBlank = exchange.getRequest().getHeaders().getOrEmpty(headerName).stream()
|
||||
.allMatch(h -> !StringUtils.hasText(h));
|
||||
|
||||
if (headerIsMissingOrBlank) {
|
||||
@@ -79,7 +93,8 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactory
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
ToStringCreator toStringCreator = filterToStringCreator(AddRequestHeadersIfNotPresentGatewayFilterFactory.this);
|
||||
ToStringCreator toStringCreator = filterToStringCreator(
|
||||
AddRequestHeadersIfNotPresentGatewayFilterFactory.this);
|
||||
for (KeyValue keyValue : config.getKeyValues()) {
|
||||
toStringCreator.append(keyValue.getKey(), keyValue.getValue());
|
||||
}
|
||||
@@ -124,6 +139,7 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactory
|
||||
public static class KeyValue {
|
||||
|
||||
private final String key;
|
||||
|
||||
private final String value;
|
||||
|
||||
public KeyValue(String key, String value) {
|
||||
|
||||
@@ -170,18 +170,16 @@ public class GatewayFilterSpec extends UriSpec {
|
||||
|
||||
/**
|
||||
* Adds a request header to the request before it is routed by the Gateway.
|
||||
* @param headers the header name(s) and value(s) as 'name-1:value-1,name-2:value-2,...'
|
||||
* @param headers the header name(s) and value(s) as
|
||||
* 'name-1:value-1,name-2:value-2,...'
|
||||
* @return a {@link GatewayFilterSpec} that can be used to apply additional filters
|
||||
*/
|
||||
public GatewayFilterSpec addRequestHeadersIfNotPresent(String... headers) {
|
||||
return filter(getBean(AddRequestHeadersIfNotPresentGatewayFilterFactory.class)
|
||||
.apply(c -> {
|
||||
KeyValue[] values = Arrays.stream(headers)
|
||||
.map(header -> header.split(":"))
|
||||
.map(parts -> new KeyValue(parts[0], parts[1]))
|
||||
.toArray(size -> new KeyValue[size]);
|
||||
c.setKeyValues(values);
|
||||
}));
|
||||
return filter(getBean(AddRequestHeadersIfNotPresentGatewayFilterFactory.class).apply(c -> {
|
||||
KeyValue[] values = Arrays.stream(headers).map(header -> header.split(":"))
|
||||
.map(parts -> new KeyValue(parts[0], parts[1])).toArray(size -> new KeyValue[size]);
|
||||
c.setKeyValues(values);
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
package org.springframework.cloud.gateway.support;
|
||||
/*
|
||||
* Copyright 2013-2022 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.gateway.support;
|
||||
|
||||
import org.springframework.cloud.gateway.filter.factory.AddRequestHeadersIfNotPresentGatewayFilterFactory.KeyValue;
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
|
||||
@@ -80,6 +80,7 @@ public class DisableBuiltInFiltersTests {
|
||||
@SpringBootTest(classes = Config.class,
|
||||
properties = { "spring.cloud.gateway.filter.add-request-header.enabled=false",
|
||||
"spring.cloud.gateway.filter.map-request-header.enabled=false",
|
||||
"spring.cloud.gateway.filter.add-request-headers-if-not-present.enabled=false",
|
||||
"spring.cloud.gateway.filter.add-request-parameter.enabled=false",
|
||||
"spring.cloud.gateway.filter.add-response-header.enabled=false",
|
||||
"spring.cloud.gateway.filter.json-to-grpc.enabled=false",
|
||||
|
||||
@@ -46,6 +46,7 @@ import static org.springframework.cloud.gateway.test.TestUtils.getMap;
|
||||
public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends BaseWebClientTests {
|
||||
|
||||
private static final String TEST_HEADER_1 = "X-Request-Example";
|
||||
|
||||
private static final String TEST_HEADER_2 = "X-Request-Second-Example";
|
||||
|
||||
private static final String TEST_HOST_HEADER_VALUE = "www.addrequestheaderjava.org";
|
||||
@@ -62,28 +63,26 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base
|
||||
|
||||
@Test
|
||||
public void addRequestHeadersIfNotPresentFilterWorks() {
|
||||
testClient.get().uri("/headers").exchange().expectBody(Map.class)
|
||||
.consumeWith(result -> {
|
||||
Map<String, Object> headers = getMap(result.getResponseBody(), "headers");
|
||||
assertThat(headers).containsEntry(TEST_HEADER_1, "ValueA");
|
||||
});
|
||||
testClient.get().uri("/headers").exchange().expectBody(Map.class).consumeWith(result -> {
|
||||
Map<String, Object> headers = getMap(result.getResponseBody(), "headers");
|
||||
assertThat(headers).containsEntry(TEST_HEADER_1, "ValueA");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addRequestHeadersIfNotPresentFilterOnlyWorksFirstPassWhenMultipleValues() {
|
||||
testClient.get().uri("/multivalueheaders").exchange()
|
||||
.expectBody(Map.class).consumeWith(result -> {
|
||||
Map<String, Object> headers = getMap(result.getResponseBody(), "headers");
|
||||
assertThat(headers).containsEntry(TEST_HEADER_1, Arrays.asList("ValueA"));
|
||||
assertThat(headers).containsEntry(TEST_HEADER_2, Arrays.asList("ValueC"));
|
||||
});
|
||||
testClient.get().uri("/multivalueheaders").exchange().expectBody(Map.class).consumeWith(result -> {
|
||||
Map<String, Object> headers = getMap(result.getResponseBody(), "headers");
|
||||
assertThat(headers).containsEntry(TEST_HEADER_1, Arrays.asList("ValueA"));
|
||||
assertThat(headers).containsEntry(TEST_HEADER_2, Arrays.asList("ValueC"));
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addRequestHeadersIfNotPresentFilterWorksOnlyMissingValues() {
|
||||
final String existingValue = "existing-value";
|
||||
testClient.get().uri("/multivalueheaders").header(TEST_HEADER_2, existingValue).exchange()
|
||||
.expectBody(Map.class).consumeWith(result -> {
|
||||
testClient.get().uri("/multivalueheaders").header(TEST_HEADER_2, existingValue).exchange().expectBody(Map.class)
|
||||
.consumeWith(result -> {
|
||||
Map<String, Object> headers = getMap(result.getResponseBody(), "headers");
|
||||
assertThat(headers).containsEntry(TEST_HEADER_1, Arrays.asList("ValueA"));
|
||||
assertThat(headers).containsEntry(TEST_HEADER_2, Arrays.asList(existingValue));
|
||||
@@ -104,21 +103,19 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base
|
||||
testClient.get().uri("/multivalueheaders").header("Host", TEST_HOST_HEADER_VALUE).exchange()
|
||||
.expectBody(Map.class).consumeWith(result -> {
|
||||
Map<String, Object> headers = getMap(result.getResponseBody(), "headers");
|
||||
assertThat(headers).containsEntry("X-Request-Acme", Arrays.asList("ValueX", "ValueY", "ValueZ", "www"));
|
||||
assertThat(headers).containsEntry("X-Request-Acme",
|
||||
Arrays.asList("ValueX", "ValueY", "ValueZ", "www"));
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toStringFormat() {
|
||||
KeyValueConfig keyValueConfig = new KeyValueConfig();
|
||||
keyValueConfig.setKeyValues(new KeyValue[] {
|
||||
new KeyValue("my-header-name-1", "my-header-value-1"),
|
||||
new KeyValue("my-header-name-2", "my-header-value-2"),
|
||||
});
|
||||
keyValueConfig.setKeyValues(new KeyValue[] { new KeyValue("my-header-name-1", "my-header-value-1"),
|
||||
new KeyValue("my-header-name-2", "my-header-value-2"), });
|
||||
GatewayFilter filter = new AddRequestHeadersIfNotPresentGatewayFilterFactory().apply(keyValueConfig);
|
||||
assertThat(filter.toString()).startsWith("[AddRequestHeadersIfNotPresent")
|
||||
.contains("my-header-name-1 = 'my-header-value-1'")
|
||||
.contains("my-header-name-2 = 'my-header-value-2'")
|
||||
.contains("my-header-name-1 = 'my-header-value-1'").contains("my-header-name-2 = 'my-header-value-2'")
|
||||
.endsWith("]");
|
||||
}
|
||||
|
||||
@@ -132,15 +129,13 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base
|
||||
|
||||
@Bean
|
||||
public RouteLocator testRouteLocator(RouteLocatorBuilder builder) {
|
||||
return builder.routes()
|
||||
.route("add_request_headers_if_not_present_java_test",
|
||||
r -> r.path("/headers").and().host("{sub}.addrequestheaderjava.org")
|
||||
.filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueB-{sub}"))
|
||||
.uri(uri))
|
||||
return builder.routes().route("add_request_headers_if_not_present_java_test",
|
||||
r -> r.path("/headers").and().host("{sub}.addrequestheaderjava.org")
|
||||
.filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueB-{sub}")).uri(uri))
|
||||
.route("add_multiple_request_headers_java_test",
|
||||
r -> r.path("/multivalueheaders").and().host("{sub}.addrequestheaderjava.org")
|
||||
.filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueX", "X-Request-Acme:ValueY",
|
||||
"X-Request-Acme:ValueZ", "X-Request-Acme:{sub}"))
|
||||
.filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueX",
|
||||
"X-Request-Acme:ValueY", "X-Request-Acme:ValueZ", "X-Request-Acme:{sub}"))
|
||||
.uri(uri))
|
||||
.build();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user