diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RoutesEndpoint.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RoutesEndpoint.java index 0174b743..ef33b9b7 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RoutesEndpoint.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RoutesEndpoint.java @@ -16,11 +16,13 @@ package org.springframework.cloud.netflix.zuul; +import java.util.LinkedHashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint; +import org.springframework.cloud.netflix.zuul.filters.Route; import org.springframework.cloud.netflix.zuul.filters.RouteLocator; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; @@ -66,7 +68,11 @@ public class RoutesEndpoint implements MvcEndpoint, ApplicationEventPublisherAwa @ResponseBody @ManagedAttribute public Map getRoutes() { - return this.routes.getRoutes(); + Map map = new LinkedHashMap<>(); + for (Route route : this.routes.getRoutes()) { + map.put(route.getPath(), route.getLocation()); + } + return map; } @Override diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/RouteLocator.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/RouteLocator.java index 2ae7f211..7c7e3857 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/RouteLocator.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/RouteLocator.java @@ -17,7 +17,7 @@ package org.springframework.cloud.netflix.zuul.filters; import java.util.Collection; -import java.util.Map; +import java.util.List; /** * @author Dave Syer @@ -32,7 +32,7 @@ public interface RouteLocator { /** * A map of route path (pattern) to location (e.g. service id or URL). */ - Map getRoutes(); + List getRoutes(); /** * Maps a path to an actual route with full metadata. diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/SimpleRouteLocator.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/SimpleRouteLocator.java index 0aff4f4f..ebca5059 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/SimpleRouteLocator.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/SimpleRouteLocator.java @@ -16,8 +16,10 @@ package org.springframework.cloud.netflix.zuul.filters; +import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicReference; @@ -58,13 +60,15 @@ public class SimpleRouteLocator implements RouteLocator { } @Override - public Map getRoutes() { + public List getRoutes() { if (this.routes.get() == null) { this.routes.set(locateRoutes()); } - Map values = new LinkedHashMap<>(); + List values = new ArrayList<>(); for (String url : this.routes.get().keySet()) { - values.put(url, this.routes.get().get(url).getLocation()); + ZuulRoute route = this.routes.get().get(url); + String path = route.getPath(); + values.add(getRoute(route, path)); } return values; } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMapping.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMapping.java index e8c152da..6835a01f 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMapping.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMapping.java @@ -22,6 +22,7 @@ import javax.servlet.http.HttpServletRequest; import org.springframework.boot.autoconfigure.web.ErrorController; import org.springframework.cloud.netflix.zuul.filters.RefreshableRouteLocator; +import org.springframework.cloud.netflix.zuul.filters.Route; import org.springframework.cloud.netflix.zuul.filters.RouteLocator; import org.springframework.util.PatternMatchUtils; import org.springframework.web.servlet.handler.AbstractUrlHandlerMapping; @@ -88,13 +89,13 @@ public class ZuulHandlerMapping extends AbstractUrlHandlerMapping { } private void registerHandlers() { - Collection routes = this.routeLocator.getRoutes().keySet(); + Collection routes = this.routeLocator.getRoutes(); if (routes.isEmpty()) { this.logger.warn("No routes found from RouteLocator"); } else { - for (String url : routes) { - registerHandler(url, this.zuul); + for (Route route : routes) { + registerHandler(route.getPrefix() + route.getPath(), this.zuul); } } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyAppTestsWithHttpClient.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyAppTestsWithHttpClient.java index d9953518..369c8f4b 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyAppTestsWithHttpClient.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyAppTestsWithHttpClient.java @@ -33,6 +33,7 @@ import org.springframework.boot.test.TestRestTemplate; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; +import org.springframework.cloud.netflix.zuul.filters.Route; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandFactory; @@ -82,7 +83,12 @@ public class SampleZuulProxyAppTestsWithHttpClient { private RibbonCommandFactory ribbonCommandFactory; private String getRoute(String path) { - return this.routes.getRoutes().get(path); + for (Route route : this.routes.getRoutes()) { + if (path.equals(route.getPrefix() + route.getPath())) { + return route.getLocation(); + } + } + return null; } @Test diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplicationTests.java index 8b0dd52f..bf2d4b5a 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplicationTests.java @@ -36,6 +36,7 @@ import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import org.springframework.cloud.netflix.ribbon.StaticServerList; +import org.springframework.cloud.netflix.zuul.filters.Route; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; import org.springframework.cloud.netflix.zuul.filters.route.RestClientRibbonCommandFactory; @@ -88,7 +89,12 @@ public class SampleZuulProxyApplicationTests { private RibbonCommandFactory ribbonCommandFactory; private String getRoute(String path) { - return this.routes.getRoutes().get(path); + for (Route route : this.routes.getRoutes()) { + if (path.equals(route.getPrefix() + route.getPath())) { + return route.getLocation(); + } + } + return null; } @Test diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SimpleZuulServerApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SimpleZuulServerApplicationTests.java index 845c6800..de02f851 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SimpleZuulServerApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SimpleZuulServerApplicationTests.java @@ -57,7 +57,7 @@ public class SimpleZuulServerApplicationTests { private RouteLocator routes; private String getRoute(String path) { - return this.routes.getRoutes().get(path); + return this.routes.getMatchingRoute(path).getLocation(); } @Test diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocatorTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocatorTests.java index d30a348f..991d770d 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocatorTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/discovery/DiscoveryClientRouteLocatorTests.java @@ -18,7 +18,7 @@ package org.springframework.cloud.netflix.zuul.filters.discovery; import java.util.Collections; import java.util.LinkedHashMap; -import java.util.Map; +import java.util.List; import org.junit.Before; import org.junit.Test; @@ -28,9 +28,8 @@ import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.netflix.zuul.filters.Route; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; -import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; -import org.springframework.cloud.netflix.zuul.filters.discovery.PatternServiceRouteMapper; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.util.StringUtils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -69,8 +68,8 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetMatchingPath() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.init(); routeLocator.getRoutes(); // force refresh @@ -81,8 +80,8 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetMatchingPathWithPrefix() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.setPrefix("/proxy"); this.properties.init(); @@ -94,8 +93,8 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetMatchingPathWithServletPath() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/app", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/app", + this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.init(); routeLocator.getRoutes(); // force refresh @@ -106,8 +105,8 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetMatchingPathWithNoPrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null)); this.properties.setStripPrefix(false); @@ -120,8 +119,8 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetMatchingPathWithLocalPrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**", "foo")); this.properties.setStripPrefix(false); this.properties.setPrefix("/proxy"); @@ -133,8 +132,8 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetMatchingPathWithGlobalPrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null)); this.properties.setPrefix("/proxy"); @@ -146,8 +145,8 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetMatchingPathWithRoutePrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); ZuulRoute zuulRoute = new ZuulRoute("/foo/**"); zuulRoute.setStripPrefix(true); this.properties.getRoutes().put("foo", zuulRoute); @@ -157,11 +156,11 @@ public class DiscoveryClientRouteLocatorTests { assertEquals("foo", route.getLocation()); assertEquals("/1", route.getPath()); } - + @Test public void testGetMatchingPathWithoutMatchingIgnoredPattern() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singletonList(IGNOREDPATTERN)); this.properties.getRoutes().put("bar", new ZuulRoute("/bar/**")); this.properties.init(); @@ -170,11 +169,11 @@ public class DiscoveryClientRouteLocatorTests { assertEquals("bar", route.getLocation()); assertEquals("bar", route.getId()); } - + @Test public void testGetMatchingPathWithMatchingIgnoredPattern() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singletonList(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.init(); @@ -184,9 +183,10 @@ public class DiscoveryClientRouteLocatorTests { } @Test - public void testGetMatchingPathWithMatchingIgnoredPatternWithPrefix() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + public void testGetMatchingPathWithMatchingIgnoredPatternWithPrefix() + throws Exception { + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singletonList(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.setPrefix("/proxy"); @@ -198,9 +198,10 @@ public class DiscoveryClientRouteLocatorTests { } @Test - public void testGetMatchingPathWithMatchingIgnoredPatternWithServletPath() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/app", this.discovery, - this.properties); + public void testGetMatchingPathWithMatchingIgnoredPatternWithServletPath() + throws Exception { + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/app", + this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singletonList(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); this.properties.init(); @@ -210,9 +211,10 @@ public class DiscoveryClientRouteLocatorTests { } @Test - public void testGetMatchingPathWithoutMatchingIgnoredPatternWithNoPrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + public void testGetMatchingPathWithoutMatchingIgnoredPatternWithNoPrefixStripping() + throws Exception { + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singletonList(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null)); @@ -225,10 +227,12 @@ public class DiscoveryClientRouteLocatorTests { } @Test - public void testGetMatchingPathWithMatchingIgnoredPatternWithNoPrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); - this.properties.setIgnoredPatterns(Collections.singletonList("/proxy" + IGNOREDPATTERN)); + public void testGetMatchingPathWithMatchingIgnoredPatternWithNoPrefixStripping() + throws Exception { + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); + this.properties + .setIgnoredPatterns(Collections.singletonList("/proxy" + IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null)); this.properties.setStripPrefix(false); @@ -239,9 +243,10 @@ public class DiscoveryClientRouteLocatorTests { } @Test - public void testGetMatchingPathWithoutMatchingIgnoredPatternWithLocalPrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + public void testGetMatchingPathWithoutMatchingIgnoredPatternWithLocalPrefixStripping() + throws Exception { + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singletonList(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**", "foo")); this.properties.setStripPrefix(false); @@ -251,12 +256,14 @@ public class DiscoveryClientRouteLocatorTests { assertEquals("foo", route.getLocation()); assertEquals("/proxy/1", route.getPath()); } - + @Test - public void testGetMatchingPathWithMatchingIgnoredPatternWithLocalPrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); - this.properties.setIgnoredPatterns(Collections.singletonList("/proxy" + IGNOREDPATTERN)); + public void testGetMatchingPathWithMatchingIgnoredPatternWithLocalPrefixStripping() + throws Exception { + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); + this.properties + .setIgnoredPatterns(Collections.singletonList("/proxy" + IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**", "foo")); this.properties.setStripPrefix(false); this.properties.setPrefix("/proxy"); @@ -266,9 +273,10 @@ public class DiscoveryClientRouteLocatorTests { } @Test - public void testGetMatchingPathWithoutMatchingIgnoredPatternWithGlobalPrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + public void testGetMatchingPathWithoutMatchingIgnoredPatternWithGlobalPrefixStripping() + throws Exception { + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredPatterns(Collections.singletonList(IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null)); @@ -278,12 +286,14 @@ public class DiscoveryClientRouteLocatorTests { assertEquals("foo", route.getLocation()); assertEquals("/foo/1", route.getPath()); } - + @Test - public void testGetMatchingPathWithMatchingIgnoredPatternWithGlobalPrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); - this.properties.setIgnoredPatterns(Collections.singletonList("/proxy" + IGNOREDPATTERN)); + public void testGetMatchingPathWithMatchingIgnoredPatternWithGlobalPrefixStripping() + throws Exception { + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); + this.properties + .setIgnoredPatterns(Collections.singletonList("/proxy" + IGNOREDPATTERN)); this.properties.getRoutes().put("foo", new ZuulRoute("foo", "/foo/**", "foo", null, false, null)); this.properties.setPrefix("/proxy"); @@ -293,9 +303,10 @@ public class DiscoveryClientRouteLocatorTests { } @Test - public void testGetMatchingPathWithMatchingIgnoredPatternWithRoutePrefixStripping() throws Exception { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + public void testGetMatchingPathWithMatchingIgnoredPatternWithRoutePrefixStripping() + throws Exception { + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); ZuulRoute zuulRoute = new ZuulRoute("/foo/**"); zuulRoute.setStripPrefix(true); this.properties.setIgnoredPatterns(Collections.singletonList(IGNOREDPATTERN)); @@ -305,14 +316,14 @@ public class DiscoveryClientRouteLocatorTests { Route route = routeLocator.getMatchingRoute("/foo/1"); assertNull("routes did not ignore " + IGNOREDPATTERN, route); } - + @Test public void testGetRoutes() { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/" + ASERVICE + "/**")); this.properties.init(); - Map routesMap = routeLocator.getRoutes(); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, ASERVICE); @@ -320,23 +331,23 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetRoutesWithMapping() { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/" + ASERVICE + "/**", ASERVICE)); this.properties.setPrefix("/foo"); - Map routesMap = routeLocator.getRoutes(); + List routesMap = routeLocator.getRoutes(); assertMapping(routesMap, ASERVICE, "foo/" + ASERVICE); } @Test public void testGetPhysicalRoutes() { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/" + ASERVICE + "/**", "http://" + ASERVICE)); - Map routesMap = routeLocator.getRoutes(); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, "http://" + ASERVICE, ASERVICE); @@ -344,10 +355,10 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetDefaultRoute() { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/**", ASERVICE)); - Map routesMap = routeLocator.getRoutes(); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertDefaultMapping(routesMap, ASERVICE); @@ -355,11 +366,11 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testGetDefaultPhysicalRoute() { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.getRoutes().put(ASERVICE, new ZuulRoute("/**", "http://" + ASERVICE)); - Map routesMap = routeLocator.getRoutes(); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertDefaultMapping(routesMap, "http://" + ASERVICE); @@ -367,50 +378,49 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testIgnoreRoutes() { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singletonList(IGNOREDSERVICE)); - given(this.discovery.getServices()).willReturn( - Collections.singletonList(IGNOREDSERVICE)); - Map routesMap = routeLocator.getRoutes(); - String serviceId = routesMap.get(getMapping(IGNOREDSERVICE)); - assertNull("routes did not ignore " + IGNOREDSERVICE, serviceId); + given(this.discovery.getServices()) + .willReturn(Collections.singletonList(IGNOREDSERVICE)); + List routesMap = routeLocator.getRoutes(); + assertNull("routes did not ignore " + IGNOREDSERVICE, + getRoute(routesMap, getMapping(IGNOREDSERVICE))); } @Test public void testIgnoreRoutesWithPattern() { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singletonList("ignore*")); - given(this.discovery.getServices()).willReturn( - Collections.singletonList(IGNOREDSERVICE)); - Map routesMap = routeLocator.getRoutes(); - String serviceId = routesMap.get(getMapping(IGNOREDSERVICE)); - assertNull("routes did not ignore " + IGNOREDSERVICE, serviceId); + given(this.discovery.getServices()) + .willReturn(Collections.singletonList(IGNOREDSERVICE)); + List routesMap = routeLocator.getRoutes(); + assertNull("routes did not ignore " + IGNOREDSERVICE, + getRoute(routesMap, getMapping(IGNOREDSERVICE))); } @Test public void testIgnoreAllRoutes() { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singletonList("*")); - given(this.discovery.getServices()).willReturn( - Collections.singletonList(IGNOREDSERVICE)); - Map routesMap = routeLocator.getRoutes(); - String serviceId = routesMap.get(getMapping(IGNOREDSERVICE)); - assertNull("routes did not ignore " + IGNOREDSERVICE, serviceId); + given(this.discovery.getServices()) + .willReturn(Collections.singletonList(IGNOREDSERVICE)); + List routesMap = routeLocator.getRoutes(); + assertNull("routes did not ignore " + IGNOREDSERVICE, + getRoute(routesMap, getMapping(IGNOREDSERVICE))); } @Test public void testIgnoredRouteIncludedIfConfiguredAndDiscovered() { this.properties.getRoutes().put("foo", new ZuulRoute("/foo/**")); - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singletonList("*")); given(this.discovery.getServices()).willReturn(Collections.singletonList("foo")); - Map routesMap = routeLocator.getRoutes(); - String serviceId = routesMap.get(getMapping("foo")); - assertNotNull("routes ignored foo", serviceId); + List routesMap = routeLocator.getRoutes(); + assertNotNull("routes ignored foo", getRoute(routesMap, "/foo/**")); } @Test @@ -419,12 +429,12 @@ public class DiscoveryClientRouteLocatorTests { route.setStripPrefix(true); route.setRetryable(Boolean.TRUE); this.properties.getRoutes().put("foo", route); - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singletonList("*")); given(this.discovery.getServices()).willReturn(Collections.singletonList("foo")); LinkedHashMap routes = routeLocator.locateRoutes(); - ZuulRoute actual = routes.get(getMapping("foo")); + ZuulRoute actual = routes.get("/foo/**"); assertNotNull("routes ignored foo", actual); assertTrue("stripPrefix is wrong", actual.isStripPrefix()); assertEquals("retryable is wrong", Boolean.TRUE, actual.getRetryable()); @@ -432,13 +442,13 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testIgnoredRouteNonServiceIdPathRemains() { - //This is how you setup a route defined like zuul.proxy.route.foo=/** + // This is how you setup a route defined like zuul.proxy.route.foo=/** ZuulRoute route = new ZuulRoute("/**", "foo"); route.setId("foo"); this.properties.getRoutes().put("foo", route); - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singletonList("*")); given(this.discovery.getServices()).willReturn(Collections.singletonList("foo")); LinkedHashMap routes = routeLocator.locateRoutes(); @@ -451,24 +461,23 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testIgnoredRouteIncludedIfConfiguredAndNotDiscovered() { - this.properties.getRoutes() - .put("foo", new ZuulRoute("/foo/**", "http://foo.com")); - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + this.properties.getRoutes().put("foo", + new ZuulRoute("/foo/**", "http://foo.com")); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); this.properties.setIgnoredServices(Collections.singletonList("*")); given(this.discovery.getServices()).willReturn(Collections.singletonList("bar")); - Map routesMap = routeLocator.getRoutes(); - String id = routesMap.get(getMapping("foo")); - assertNotNull("routes ignored foo", id); + List routesMap = routeLocator.getRoutes(); + assertNotNull("routes ignored foo", getRoute(routesMap, getMapping("foo"))); } @Test public void testAutoRoutes() { - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); - given(this.discovery.getServices()).willReturn( - Collections.singletonList(MYSERVICE)); - Map routesMap = routeLocator.getRoutes(); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); + given(this.discovery.getServices()) + .willReturn(Collections.singletonList(MYSERVICE)); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, MYSERVICE); @@ -476,14 +485,14 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testAutoRoutesCanBeOverridden() { - ZuulRoute route = new ZuulRoute("/" + MYSERVICE + "/**", "http://example.com/" - + MYSERVICE); + ZuulRoute route = new ZuulRoute("/" + MYSERVICE + "/**", + "http://example.com/" + MYSERVICE); this.properties.getRoutes().put(MYSERVICE, route); - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); - given(this.discovery.getServices()).willReturn( - Collections.singletonList(MYSERVICE)); - Map routesMap = routeLocator.getRoutes(); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); + given(this.discovery.getServices()) + .willReturn(Collections.singletonList(MYSERVICE)); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, "http://example.com/" + MYSERVICE, MYSERVICE); @@ -491,17 +500,19 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testIgnoredLocalServiceByDefault() { - given(this.discovery.getServices()).willReturn(Collections.singletonList(MYSERVICE)); - given(this.discovery.getLocalServiceInstance()).willReturn(new DefaultServiceInstance(MYSERVICE, "localhost", 80, false)); + given(this.discovery.getServices()) + .willReturn(Collections.singletonList(MYSERVICE)); + given(this.discovery.getLocalServiceInstance()).willReturn( + new DefaultServiceInstance(MYSERVICE, "localhost", 80, false)); - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); LinkedHashMap routes = routeLocator.locateRoutes(); ZuulRoute actual = routes.get("/**"); - assertNull("routes didn't ignore "+MYSERVICE, actual); + assertNull("routes didn't ignore " + MYSERVICE, actual); - Map routesMap = routeLocator.getRoutes(); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertTrue("routesMap was empty", routesMap.isEmpty()); } @@ -510,12 +521,13 @@ public class DiscoveryClientRouteLocatorTests { public void testIgnoredLocalServiceFalse() { this.properties.setIgnoreLocalService(false); - given(this.discovery.getServices()).willReturn(Collections.singletonList(MYSERVICE)); + given(this.discovery.getServices()) + .willReturn(Collections.singletonList(MYSERVICE)); - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties); - Map routesMap = routeLocator.getRoutes(); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, MYSERVICE); @@ -523,13 +535,15 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testRegExServiceRouteMapperNoServiceIdMatches() { - given(this.discovery.getServices()).willReturn(Collections.singletonList(MYSERVICE)); + given(this.discovery.getServices()) + .willReturn(Collections.singletonList(MYSERVICE)); - PatternServiceRouteMapper regExServiceRouteMapper = new PatternServiceRouteMapper(properties.getRegexMapper().getServicePattern(), - properties.getRegexMapper().getRoutePattern()); - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties, regExServiceRouteMapper); - Map routesMap = routeLocator.getRoutes(); + PatternServiceRouteMapper regExServiceRouteMapper = new PatternServiceRouteMapper( + this.properties.getRegexMapper().getServicePattern(), + this.properties.getRegexMapper().getRoutePattern()); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties, regExServiceRouteMapper); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, MYSERVICE); @@ -537,38 +551,53 @@ public class DiscoveryClientRouteLocatorTests { @Test public void testRegExServiceRouteMapperServiceIdMatches() { - given(this.discovery.getServices()).willReturn(Collections.singletonList("rest-service-v1")); + given(this.discovery.getServices()) + .willReturn(Collections.singletonList("rest-service-v1")); - PatternServiceRouteMapper regExServiceRouteMapper = new PatternServiceRouteMapper(properties.getRegexMapper().getServicePattern(), - properties.getRegexMapper().getRoutePattern()); - DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", this.discovery, - this.properties, regExServiceRouteMapper); - Map routesMap = routeLocator.getRoutes(); + PatternServiceRouteMapper regExServiceRouteMapper = new PatternServiceRouteMapper( + this.properties.getRegexMapper().getServicePattern(), + this.properties.getRegexMapper().getRoutePattern()); + DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/", + this.discovery, this.properties, regExServiceRouteMapper); + List routesMap = routeLocator.getRoutes(); assertNotNull("routesMap was null", routesMap); assertFalse("routesMap was empty", routesMap.isEmpty()); assertMapping(routesMap, "rest-service-v1", "v1/rest-service"); } - - protected void assertMapping(Map routesMap, String serviceId) { + protected void assertMapping(List routesMap, String serviceId) { assertMapping(routesMap, serviceId, serviceId); } - protected void assertMapping(Map routesMap, String expectedRoute, + protected void assertMapping(List routesMap, String expectedRoute, String key) { String mapping = getMapping(key); - String route = routesMap.get(mapping); - assertEquals("routesMap had wrong value for " + mapping, expectedRoute, route); + Route route = getRoute(routesMap, mapping); + assertNotNull("Could not find route for " + key, route); + String location = route.getLocation(); + assertEquals("routesMap had wrong value for " + mapping, expectedRoute, location); } private String getMapping(String serviceId) { return "/" + serviceId + "/**"; } - protected void assertDefaultMapping(Map routesMap, - String expectedRoute) { + protected void assertDefaultMapping(List routesMap, String expectedRoute) { String mapping = "/**"; - String route = routesMap.get(mapping); + String route = getRoute(routesMap, mapping).getLocation(); assertEquals("routesMap had wrong value for " + mapping, expectedRoute, route); } + + private Route getRoute(List routes, String path) { + for (Route route : routes) { + String pattern = route.getPath(); + if (StringUtils.hasText(route.getPrefix())) { + pattern = route.getPrefix() + route.getPath(); + } + if (path.equals(pattern)) { + return route; + } + } + return null; + } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMappingTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMappingTests.java index 9ecf9bd5..d3aa2d71 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMappingTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/web/ZuulHandlerMappingTests.java @@ -22,6 +22,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.springframework.boot.autoconfigure.web.ErrorController; +import org.springframework.cloud.netflix.zuul.filters.Route; import org.springframework.cloud.netflix.zuul.filters.RouteLocator; import org.springframework.mock.web.MockHttpServletRequest; @@ -53,8 +54,8 @@ public class ZuulHandlerMappingTests { @Test public void mappedPath() throws Exception { - Mockito.when(this.locator.getRoutes()) - .thenReturn(Collections.singletonMap("/foo/**", "foo")); + Mockito.when(this.locator.getRoutes()).thenReturn( + Collections.singletonList(new Route("foo", "/foo/**", "foo", "", null))); this.request.setServletPath("/foo/"); this.mapping.setDirty(true); assertNotNull(this.mapping.getHandler(this.request)); @@ -62,8 +63,8 @@ public class ZuulHandlerMappingTests { @Test public void defaultPath() throws Exception { - Mockito.when(this.locator.getRoutes()) - .thenReturn(Collections.singletonMap("/**", "default")); + Mockito.when(this.locator.getRoutes()).thenReturn( + Collections.singletonList(new Route("default", "/**", "foo", "", null))); ; this.request.setServletPath("/"); this.mapping.setDirty(true); @@ -72,8 +73,8 @@ public class ZuulHandlerMappingTests { @Test public void errorPath() throws Exception { - Mockito.when(this.locator.getRoutes()) - .thenReturn(Collections.singletonMap("/**", "default")); + Mockito.when(this.locator.getRoutes()).thenReturn( + Collections.singletonList(new Route("default", "/**", "foo", "", null))); this.request.setServletPath("/error"); this.mapping.setDirty(true); assertNull(this.mapping.getHandler(this.request));