Polish gh-2737

Formatting, added missing copyright and updated DisableBuiltInFiltersTests to include new filter.
This commit is contained in:
spencergibb
2022-10-05 11:37:40 -04:00
parent f45d03ec1d
commit 34673a9de8
5 changed files with 68 additions and 43 deletions

View File

@@ -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 requests 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 requests 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) {

View File

@@ -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);
}));
}
/**

View File

@@ -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;

View File

@@ -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",

View File

@@ -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();
}