diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/Routes.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/Routes.java index b8633105..e89ad62e 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/Routes.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/Routes.java @@ -43,7 +43,7 @@ public class Routes { private List routes = new ArrayList<>(); - public RouteSpec route(String id) { + public PredicateSpec route(String id) { return new RouteSpec(this).id(id); } @@ -51,6 +51,18 @@ public class Routes { this.routes.add(route); } + LocatorBuilder uri(Route.Builder builder, String uri) { + Route route = builder.uri(uri).build(); + routes.add(route); + return this; + } + + LocatorBuilder uri(Route.Builder builder, URI uri) { + Route route = builder.uri(uri).build(); + routes.add(route); + return this; + } + public RouteLocator build() { return () -> Flux.fromIterable(this.routes); } @@ -65,23 +77,8 @@ public class Routes { this.locatorBuilder = locatorBuilder; } - public RouteSpec id(String id) { + public PredicateSpec id(String id) { this.builder.id(id); - return this; - } - - public RouteSpec order(int order) { - this.builder.order(order); - return this; - } - - public PredicateSpec uri(String uri) { - this.builder.uri(uri); - return predicateBuilder(); - } - - public PredicateSpec uri(URI uri) { - this.builder.uri(uri); return predicateBuilder(); } @@ -93,11 +90,11 @@ public class Routes { public static class PredicateSpec { - private final Route.Builder routeBuilder; + private final Route.Builder builder; private LocatorBuilder locatorBuilder; - private PredicateSpec(Route.Builder routeBuilder, LocatorBuilder locatorBuilder) { - this.routeBuilder = routeBuilder; + private PredicateSpec(Route.Builder builder, LocatorBuilder locatorBuilder) { + this.builder = builder; this.locatorBuilder = locatorBuilder; } @@ -109,15 +106,27 @@ public class Routes { Predicate predicate = RoutePredicates.host(pattern); }*/ + public PredicateSpec order(int order) { + this.builder.order(order); + return this; + } + public GatewayFilterSpec predicate(Predicate predicate) { - this.routeBuilder.predicate(predicate); + this.builder.predicate(predicate); return gatewayFilterBuilder(); } private GatewayFilterSpec gatewayFilterBuilder() { - return new GatewayFilterSpec(this.routeBuilder, this.locatorBuilder); + return new GatewayFilterSpec(this.builder, this.locatorBuilder); } + public LocatorBuilder uri(String uri) { + return this.locatorBuilder.uri(this.builder, uri); + } + + public LocatorBuilder uri(URI uri) { + return this.locatorBuilder.uri(this.builder, uri); + } } public static class GatewayFilterSpec { @@ -156,11 +165,12 @@ public class Routes { return add(GatewayFilters.addResponseHeader(headerName, headerValue)); } - // TODO: build()? - public LocatorBuilder and() { - Route route = this.builder.build(); - this.locatorBuilder.add(route); - return this.locatorBuilder; + public LocatorBuilder uri(String uri) { + return this.locatorBuilder.uri(this.builder, uri); + } + + public LocatorBuilder uri(URI uri) { + return this.locatorBuilder.uri(this.builder, uri); } } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/PrincipalNameKeyResolverIntegrationTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/PrincipalNameKeyResolverIntegrationTests.java index 7a3bcb73..976ed162 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/PrincipalNameKeyResolverIntegrationTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/ratelimit/PrincipalNameKeyResolverIntegrationTests.java @@ -99,11 +99,10 @@ public class PrincipalNameKeyResolverIntegrationTests { public RouteLocator customRouteLocator(RequestRateLimiterGatewayFilterFactory rateLimiterFactory) { return Routes.locator() .route("protected-throttled") - .uri("http://localhost:"+port) .predicate(path("/myapi/**")) .filter(rateLimiterFactory.apply(tuple().of(REPLENISH_RATE_KEY, 1, BURST_CAPACITY_KEY, 1))) .filter(prefixPath("/downstream")) - .and() + .uri("http://localhost:"+port) .build(); } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/websocket/WebSocketIntegrationTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/websocket/WebSocketIntegrationTests.java index 13268ddd..f3822887 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/websocket/WebSocketIntegrationTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/websocket/WebSocketIntegrationTests.java @@ -304,9 +304,8 @@ public class WebSocketIntegrationTests { public RouteLocator wsRouteLocator() { return Routes.locator() .route("testws") - .uri("ws://localhost:"+this.wsPort) .predicate(alwaysTrue()) - .and() + .uri("ws://localhost:"+this.wsPort) .build(); } } diff --git a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java index f4402a73..528c3c91 100644 --- a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java +++ b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java @@ -45,24 +45,21 @@ public class GatewaySampleApplication { public RouteLocator customRouteLocator(ThrottleGatewayFilterFactory throttle) { return Routes.locator() .route("test") - .uri("http://httpbin.org:80") .predicate(host("**.abc.org").and(path("/image/png"))) .addResponseHeader("X-TestHeader", "foobar") - .and() - .route("test2") .uri("http://httpbin.org:80") + .route("test2") .predicate(path("/image/webp")) .add(addResponseHeader("X-AnotherHeader", "baz")) - .and() + .uri("http://httpbin.org:80") .route("test3") .order(-1) - .uri("http://httpbin.org:80") .predicate(host("**.throttle.org").and(path("/get"))) .add(throttle.apply(tuple().of("capacity", 1, "refillTokens", 1, "refillPeriod", 10, "refillUnit", "SECONDS"))) - .and() + .uri("http://httpbin.org:80") .build(); }