diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory.java index f9b51114..9cf82025 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory.java @@ -16,6 +16,7 @@ package org.springframework.cloud.gateway.handler.predicate; +import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -59,22 +60,25 @@ public class HostRoutePredicateFactory extends AbstractRoutePredicateFactory variables = pathMatcher.extractUriTemplateVariables(match, host); - ServerWebExchangeUtils.putUriTemplateVariables(exchange, variables); - return true; - } + if (match != null) { + Map variables = pathMatcher.extractUriTemplateVariables(match, host); + ServerWebExchangeUtils.putUriTemplateVariables(exchange, variables); + return true; + } + } return false; } diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java index ec917fbe..7cb20096 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ShortcutConfigurable.java @@ -151,7 +151,8 @@ public interface ShortcutConfigurable { // strip boolean flag if last entry is true or false int lastIdx = values.size() - 1; String lastValue = values.get(lastIdx); - if ("true".equalsIgnoreCase(lastValue) || "false".equalsIgnoreCase(lastValue) || lastValue == null) { + if ("true".equalsIgnoreCase(lastValue) || "false".equalsIgnoreCase(lastValue) + || lastValue == null) { values = values.subList(0, lastIdx); map.put(fieldOrder.get(1), getValue(parser, beanFactory, lastValue)); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactoryTests.java index 10fb4f85..b6a528d1 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactoryTests.java @@ -74,6 +74,11 @@ public class HostRoutePredicateFactoryTests extends BaseWebClientTests { expectHostRoute("www.hostmultidsl2.org", "host_multi_dsl"); } + @Test + public void sameHostWithPort() { + expectHostRoute("hostpatternarg.org:8080", "without_pattern"); + } + @Test public void toStringFormat() { Config config = new Config().setPatterns(Arrays.asList("pattern1", "pattern2")); diff --git a/spring-cloud-gateway-server/src/test/resources/application.yml b/spring-cloud-gateway-server/src/test/resources/application.yml index b031e413..5e62bd4b 100644 --- a/spring-cloud-gateway-server/src/test/resources/application.yml +++ b/spring-cloud-gateway-server/src/test/resources/application.yml @@ -214,6 +214,15 @@ spring: predicates: - Header=Foo, .* + + # ===================================== + - id: without_pattern + uri: ${test.uri} + predicates: + - name: Host + args: + pattern: 'hostpatternarg.org' + # ===================================== - id: host_backwards_compatible_test uri: ${test.uri}