From 34673a9de8885c05d3fb633b04094f5334f891d9 Mon Sep 17 00:00:00 2001 From: spencergibb Date: Wed, 5 Oct 2022 11:37:40 -0400 Subject: [PATCH] Polish gh-2737 Formatting, added missing copyright and updated DisableBuiltInFiltersTests to include new filter. --- ...adersIfNotPresentGatewayFilterFactory.java | 28 ++++++++--- .../route/builder/GatewayFilterSpec.java | 16 +++--- .../gateway/support/KeyValueConverter.java | 17 ++++++- .../DisableBuiltInFiltersTests.java | 1 + ...IfNotPresentGatewayFilterFactoryTests.java | 49 +++++++++---------- 5 files changed, 68 insertions(+), 43 deletions(-) diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java index d47f16c6..f912b928 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java @@ -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> 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) { diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java index 9c704a27..8d23d423 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java @@ -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); + })); } /** diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/KeyValueConverter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/KeyValueConverter.java index cf8ad848..572b4190 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/KeyValueConverter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/KeyValueConverter.java @@ -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; diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInFiltersTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInFiltersTests.java index 9eea24b1..77ddb901 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInFiltersTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/config/conditional/DisableBuiltInFiltersTests.java @@ -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", diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java index 3fdaa6ed..160aa874 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java @@ -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 headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry(TEST_HEADER_1, "ValueA"); - }); + testClient.get().uri("/headers").exchange().expectBody(Map.class).consumeWith(result -> { + Map 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 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 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 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 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(); }