From ed5dd81beb089573390c0dd5376ec65d45677e66 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Sat, 18 Mar 2017 00:10:27 -0600 Subject: [PATCH] Adds more convenient filter methods --- .../cloud/gateway/route/Routes.java | 71 +++++++++++++++---- .../sample/GatewaySampleApplication.java | 5 +- 2 files changed, 59 insertions(+), 17 deletions(-) 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 b00fb5e3..2938d0c2 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 @@ -17,15 +17,17 @@ package org.springframework.cloud.gateway.route; -import org.springframework.web.reactive.function.server.RequestPredicate; -import org.springframework.web.server.WebFilter; -import reactor.core.publisher.Flux; - import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import org.springframework.cloud.gateway.filter.factory.WebFilterFactories; +import org.springframework.web.reactive.function.server.RequestPredicate; +import org.springframework.web.server.WebFilter; + +import reactor.core.publisher.Flux; + /** * @author Spencer Gibb */ @@ -66,37 +68,76 @@ public class Routes { return this; } - public RouteBuilder uri(String uri) { + public PredicateBuilder uri(String uri) { this.builder.uri(uri); - return this; + return predicateBuilder(); } - public RouteBuilder uri(URI uri) { + public PredicateBuilder uri(URI uri) { this.builder.uri(uri); - return this; + return predicateBuilder(); } - public RouteBuilder predicate(RequestPredicate predicate) { - this.builder.requestPredicate(predicate); - return this; + private PredicateBuilder predicateBuilder() { + return new PredicateBuilder(this.builder, this.locatorBuilder); } - //TODO: maybe add WebFilterBuilder so no need to import WebFilterFactories? - public RouteBuilder webFilters(List webFilters) { + } + + public static class PredicateBuilder { + + private final Route.Builder routeBuilder; + private LocatorBuilder locatorBuilder; + + private PredicateBuilder(Route.Builder routeBuilder, LocatorBuilder locatorBuilder) { + this.routeBuilder = routeBuilder; + this.locatorBuilder = locatorBuilder; + } + + /* TODO: has and, or & negate of RequestPredicate with terminal filters()? + public RequestPredicateBuilder host(String pattern) { + RequestPredicate requestPredicate = GatewayRequestPredicates.host(pattern); + }*/ + + public WebFilterBuilder predicate(RequestPredicate predicate) { + this.routeBuilder.requestPredicate(predicate); + return webFilterBuilder(); + } + + private WebFilterBuilder webFilterBuilder() { + return new WebFilterBuilder(this.routeBuilder, this.locatorBuilder); + } + + } + + public static class WebFilterBuilder { + private Route.Builder builder; + private LocatorBuilder locatorBuilder; + + public WebFilterBuilder(Route.Builder routeBuilder, LocatorBuilder locatorBuilder) { + this.builder = routeBuilder; + this.locatorBuilder = locatorBuilder; + } + + public WebFilterBuilder webFilters(List webFilters) { this.builder.webFilters(webFilters); return this; } - public RouteBuilder add(WebFilter webFilter) { + public WebFilterBuilder add(WebFilter webFilter) { this.builder.add(webFilter); return this; } - public RouteBuilder addAll(Collection webFilters) { + public WebFilterBuilder addAll(Collection webFilters) { this.builder.addAll(webFilters); return this; } + public WebFilterBuilder addResponseHeader(String headerName, String headerValue) { + return add(WebFilterFactories.addResponseHeader(headerName, headerValue)); + } + public LocatorBuilder and() { Route route = this.builder.build(); this.locatorBuilder.add(route); 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 7c727fa1..8c6cc034 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 @@ -26,6 +26,7 @@ import org.springframework.cloud.gateway.route.Routes; import org.springframework.context.annotation.Bean; import static org.springframework.cloud.gateway.filter.factory.WebFilterFactories.addResponseHeader; +import static org.springframework.cloud.gateway.handler.predicate.GatewayRequestPredicates.host; import static org.springframework.cloud.gateway.handler.predicate.GatewayRequestPredicates.path; // import static org.springframework.web.reactive.function.server.RequestPredicates.path; @@ -42,8 +43,8 @@ public class GatewaySampleApplication { return Routes.locator() .route("test") .uri("http://httpbin.org:80") - .predicate(path("/image/png")) - .add(addResponseHeader("X-TestHeader", "foobar")) + .predicate(host("**.abc.org").and(path("/image/png"))) + .addResponseHeader("X-TestHeader", "foobar") .and() .route("test2") .uri("http://httpbin.org:80")