From da2f28e25bd3ba1387fe3bf488df189ba11fba31 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 2 Feb 2018 16:22:31 -0500 Subject: [PATCH] Add filters() method to Java DSL. Deprecates direct filter methods after predicates. Thanks @joshlong --- .../gateway/route/builder/BooleanSpec.java | 221 +++++++++++++++++- ...veHostHeaderGatewayFilterFactoryTests.java | 6 +- ...equestHeaderGatewayFilterFactoryTests.java | 6 +- .../sample/GatewaySampleApplication.java | 12 +- 4 files changed, 231 insertions(+), 14 deletions(-) diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/builder/BooleanSpec.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/builder/BooleanSpec.java index 672df435..4d571eb2 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/builder/BooleanSpec.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/builder/BooleanSpec.java @@ -16,15 +16,27 @@ package org.springframework.cloud.gateway.route.builder; +import java.net.URI; +import java.net.URL; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.route.Route; +import org.springframework.http.HttpStatus; +import org.springframework.tuple.Tuple; import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; -import java.util.function.Predicate; +import com.netflix.hystrix.HystrixObservableCommand; -import static org.springframework.cloud.gateway.route.builder.BooleanSpec.Operator.*; +import static org.springframework.cloud.gateway.route.builder.BooleanSpec.Operator.AND; +import static org.springframework.cloud.gateway.route.builder.BooleanSpec.Operator.NEGATE; +import static org.springframework.cloud.gateway.route.builder.BooleanSpec.Operator.OR; -public class BooleanSpec extends GatewayFilterSpec { +public class BooleanSpec extends GatewayFilterSpec { //TODO after next release, extend UriSpec enum Operator { AND, OR, NEGATE } @@ -48,6 +60,10 @@ public class BooleanSpec extends GatewayFilterSpec { return new BooleanOpSpec(routeBuilder, builder, NEGATE); } + public UriSpec filters(Function fn) { + return fn.apply(new GatewayFilterSpec(routeBuilder, builder)); + } + public static class BooleanOpSpec extends PredicateSpec { private Operator operator; @@ -73,4 +89,203 @@ public class BooleanSpec extends GatewayFilterSpec { return createBooleanSpec(); } } + + //TODO: after next release remove all deprecated methods + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec gatewayFilters(List gatewayFilters) { + return super.gatewayFilters(gatewayFilters); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec add(GatewayFilter gatewayFilter) { + return super.add(gatewayFilter); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec filter(GatewayFilter gatewayFilter) { + return super.filter(gatewayFilter); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec filter(GatewayFilter gatewayFilter, int order) { + return super.filter(gatewayFilter, order); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec addAll(Collection gatewayFilters) { + return super.addAll(gatewayFilters); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec addRequestHeader(String headerName, String headerValue) { + return super.addRequestHeader(headerName, headerValue); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec addRequestParameter(String param, String value) { + return super.addRequestParameter(param, value); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec addResponseHeader(String headerName, String headerValue) { + return super.addResponseHeader(headerName, headerValue); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec hystrix(String commandName) { + return super.hystrix(commandName); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec hystrix(HystrixObservableCommand.Setter setter) { + return super.hystrix(setter); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec hystrix(String commandName, URI fallbackUri) { + return super.hystrix(commandName, fallbackUri); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec hystrix(HystrixObservableCommand.Setter setter, URI fallbackUri) { + return super.hystrix(setter, fallbackUri); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec prefixPath(String prefix) { + return super.prefixPath(prefix); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec preserveHostHeader() { + return super.preserveHostHeader(); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec redirect(int status, URI url) { + return super.redirect(status, url); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec redirect(int status, String url) { + return super.redirect(status, url); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec redirect(String status, URI url) { + return super.redirect(status, url); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec redirect(String status, String url) { + return super.redirect(status, url); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec redirect(HttpStatus status, URL url) { + return super.redirect(status, url); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec removeNonProxyHeaders() { + return super.removeNonProxyHeaders(); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec removeNonProxyHeaders(String... headersToRemove) { + return super.removeNonProxyHeaders(headersToRemove); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec removeRequestHeader(String headerName) { + return super.removeRequestHeader(headerName); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec removeResponseHeader(String headerName) { + return super.removeResponseHeader(headerName); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec requestRateLimiter(Tuple args) { + return super.requestRateLimiter(args); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec rewritePath(String regex, String replacement) { + return super.rewritePath(regex, replacement); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec secureHeaders() { + return super.secureHeaders(); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec setPath(String template) { + return super.setPath(template); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec setRequestHeader(String headerName, String headerValue) { + return super.setRequestHeader(headerName, headerValue); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec setResponseHeader(String headerName, String headerValue) { + return super.setResponseHeader(headerName, headerValue); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec setStatus(int status) { + return super.setStatus(status); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec setStatus(String status) { + return super.setStatus(status); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec setStatus(HttpStatus status) { + return super.setStatus(status); + } + + @Override + @Deprecated /** @deprecated use {@link #filters(Function)} */ + public GatewayFilterSpec saveSession() { + return super.saveSession(); + } } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/PreserveHostHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/PreserveHostHeaderGatewayFilterFactoryTests.java index 54460e00..8ad5876c 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/PreserveHostHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/PreserveHostHeaderGatewayFilterFactoryTests.java @@ -71,9 +71,9 @@ public class PreserveHostHeaderGatewayFilterFactoryTests extends BaseWebClientTe return builder.routes().route("test_preserve_host_header", r -> r.order(-1) .host("**.preservehostheader.org") - .prefixPath("/httpbin") - .preserveHostHeader() - .setRequestHeader("Host", "myhost.net") + .filters(f -> f.prefixPath("/httpbin") + .preserveHostHeader() + .setRequestHeader("Host", "myhost.net")) .uri(uri)) .build(); } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHeaderGatewayFilterFactoryTests.java index 09cd06ae..2d180a2b 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/SetRequestHeaderGatewayFilterFactoryTests.java @@ -72,9 +72,9 @@ public class SetRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTest return builder.routes().route("test_set_request_header", r -> r.order(-1) .host("**.setrequestheader.org") - .prefixPath("/httpbin") - .addRequestHeader("X-Req-Foo", "First") - .setRequestHeader("X-Req-Foo", "Second") + .filters(f -> f.prefixPath("/httpbin") + .addRequestHeader("X-Req-Foo", "First") + .setRequestHeader("X-Req-Foo", "Second")) .uri(uri)) .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 fed60f45..86e9ff74 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,19 +45,21 @@ public class GatewaySampleApplication { //@formatter:off return builder.routes() .route(r -> r.host("**.abc.org").and().path("/image/png") - .addResponseHeader("X-TestHeader", "foobar") - .uri("http://httpbin.org:80") + .filters(f -> + f.addResponseHeader("X-TestHeader", "foobar")) + .uri("http://httpbin.org:80") ) .route(r -> r.path("/image/webp") - .addResponseHeader("X-AnotherHeader", "baz") + .filters(f -> + f.addResponseHeader("X-AnotherHeader", "baz")) .uri("http://httpbin.org:80") ) .route(r -> r.order(-1) .host("**.throttle.org").and().path("/get") - .filter(throttle.apply(1, + .filters(f -> f.filter(throttle.apply(1, 1, 10, - TimeUnit.SECONDS)) + TimeUnit.SECONDS))) .uri("http://httpbin.org:80") ) .build();