From 242fc34305c28c4a6e35a5e509fec3a25571b1c1 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Thu, 17 Jan 2019 10:10:50 -0500 Subject: [PATCH] Validate that we actually have a hostname when using a load balanced URI. Fixes #779 --- .../cloud/gateway/filter/RouteToRequestUrlFilter.java | 6 ++++++ .../gateway/filter/RouteToRequestUrlFilterTests.java | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java index e76046e5..e8d439f9 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilter.java @@ -68,6 +68,12 @@ public class RouteToRequestUrlFilter implements GlobalFilter, Ordered { routeUri = URI.create(routeUri.getSchemeSpecificPart()); } + if("lb".equalsIgnoreCase(routeUri.getScheme()) && routeUri.getHost() == null) { + //Load balanced URIs should always have a host. If the host is null it is most + //likely because the host name was invalid (for example included an underscore) + throw new IllegalStateException("Invalid host: " + routeUri.toString()); + } + URI mergedUrl = UriComponentsBuilder.fromUri(uri) // .uri(routeUri) .scheme(routeUri.getScheme()) diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilterTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilterTests.java index 97ec6c5a..477ccf62 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilterTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/RouteToRequestUrlFilterTests.java @@ -66,6 +66,14 @@ public class RouteToRequestUrlFilterTests { assertThat(uri).hasScheme("lb").hasHost("myhost"); } + @Test(expected = IllegalStateException.class) + public void invalidHost() { + MockServerHttpRequest request = MockServerHttpRequest + .get("http://localhost/getb") + .build(); + testFilter(request, "lb://my_host"); + } + @Test public void happyPathLbPlusScheme() { MockServerHttpRequest request = MockServerHttpRequest