diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java index e96e9bc6..97d8c43d 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactory.java @@ -17,7 +17,6 @@ package org.springframework.cloud.gateway.handler.predicate; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.function.Predicate; import java.util.regex.Pattern; @@ -59,9 +58,7 @@ public class HeaderRoutePredicateFactory extends AbstractRoutePredicateFactory values = exchange.getRequest() - .getHeaders() - .getOrDefault(config.header, Collections.emptyList()); + List values = exchange.getRequest().getHeaders().getValuesAsList(config.header); if (values.isEmpty()) { return false; } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java index 92be2a3a..6792ed97 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HeaderRoutePredicateFactoryTests.java @@ -92,6 +92,20 @@ public class HeaderRoutePredicateFactoryTests extends BaseWebClientTests { assertThat(predicate.toString()).contains("Header: myheader regexp=myregexp"); } + @Test + public void headerRouteHandlesCommaSeparatedValues() { + testClient.get() + .uri("/get") + .header("X-Example-Header", "value1, value2 ,exact_match,value3") + .exchange() + .expectStatus() + .isOk() + .expectHeader() + .valueEquals(HANDLER_MAPPER_HEADER, RoutePredicateHandlerMapping.class.getSimpleName()) + .expectHeader() + .valueEquals(ROUTE_ID_HEADER, "header_test_comma_separated"); + } + @EnableAutoConfiguration @SpringBootConfiguration @Import(DefaultTestConfig.class) @@ -104,6 +118,10 @@ public class HeaderRoutePredicateFactoryTests extends BaseWebClientTests { RouteLocator queryRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("header_exists_dsl", r -> r.header("X-Foo").filters(f -> f.prefixPath("/httpbin")).uri(uri)) + .route("header_test_comma_separated", + r -> r.header("X-Example-Header", "exact_match") + .filters(f -> f.prefixPath("/httpbin")) + .uri(uri)) .build(); }