diff --git a/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java b/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java index bd83f4a9..f0cbf93d 100644 --- a/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java +++ b/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java @@ -9,24 +9,24 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.cloud.gateway.actuate.GatewayEndpoint; import org.springframework.cloud.gateway.api.RouteReader; import org.springframework.cloud.gateway.filter.GatewayFilter; -import org.springframework.cloud.gateway.filter.factory.AddRequestHeaderFilterFactory; -import org.springframework.cloud.gateway.filter.factory.AddResponseHeaderFilterFactory; -import org.springframework.cloud.gateway.filter.factory.FilterFactory; import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter; -import org.springframework.cloud.gateway.filter.factory.RemoveRequestHeaderFilterFactory; -import org.springframework.cloud.gateway.filter.factory.RemoveResponseHeaderFilterFactory; -import org.springframework.cloud.gateway.filter.factory.RewritePathFilterFactory; -import org.springframework.cloud.gateway.filter.factory.SetPathFilterFactory; -import org.springframework.cloud.gateway.filter.factory.SetResponseHeaderFilterFactory; -import org.springframework.cloud.gateway.filter.factory.SetStatusFilterFactory; +import org.springframework.cloud.gateway.filter.route.AddRequestHeaderRouteFilter; +import org.springframework.cloud.gateway.filter.route.AddResponseHeaderRouteFilter; +import org.springframework.cloud.gateway.filter.route.RemoveRequestHeaderRouteFilter; +import org.springframework.cloud.gateway.filter.route.RemoveResponseHeaderRouteFilter; +import org.springframework.cloud.gateway.filter.route.RewritePathRouteFilter; +import org.springframework.cloud.gateway.filter.route.RouteFilter; +import org.springframework.cloud.gateway.filter.route.SetPathRouteFilter; +import org.springframework.cloud.gateway.filter.route.SetResponseHeaderRouteFilter; +import org.springframework.cloud.gateway.filter.route.SetStatusRouteFilter; import org.springframework.cloud.gateway.handler.GatewayFilteringWebHandler; import org.springframework.cloud.gateway.handler.GatewayPredicateHandlerMapping; import org.springframework.cloud.gateway.handler.GatewayWebHandler; import org.springframework.cloud.gateway.handler.predicate.CookiePredicateFactory; +import org.springframework.cloud.gateway.handler.predicate.HeaderPredicateFactory; import org.springframework.cloud.gateway.handler.predicate.HostPredicateFactory; import org.springframework.cloud.gateway.handler.predicate.MethodPredicateFactory; import org.springframework.cloud.gateway.handler.predicate.PredicateFactory; -import org.springframework.cloud.gateway.handler.predicate.HeaderPredicateFactory; import org.springframework.cloud.gateway.handler.predicate.QueryPredicateFactory; import org.springframework.cloud.gateway.handler.predicate.UrlPredicateFactory; import org.springframework.context.annotation.Bean; @@ -71,7 +71,7 @@ public class GatewayAutoConfiguration { @Bean public GatewayFilteringWebHandler gatewayFilteringWebHandler(GatewayWebHandler gatewayWebHandler, List filters, - List filterDefinitions) { + List filterDefinitions) { return new GatewayFilteringWebHandler(gatewayWebHandler, filters, filterDefinitions); } @@ -117,43 +117,43 @@ public class GatewayAutoConfiguration { // Filter Factory beans @Bean - public AddRequestHeaderFilterFactory addRequestHeaderFilterFactory() { - return new AddRequestHeaderFilterFactory(); + public AddRequestHeaderRouteFilter addRequestHeaderRouteFilter() { + return new AddRequestHeaderRouteFilter(); } @Bean - public AddResponseHeaderFilterFactory addResponseHeaderFilterFactory() { - return new AddResponseHeaderFilterFactory(); + public AddResponseHeaderRouteFilter addResponseHeaderRouteFilter() { + return new AddResponseHeaderRouteFilter(); } @Bean - public RemoveRequestHeaderFilterFactory removeRequestHeaderFilterFactory() { - return new RemoveRequestHeaderFilterFactory(); + public RemoveRequestHeaderRouteFilter removeRequestHeaderRouteFilter() { + return new RemoveRequestHeaderRouteFilter(); } @Bean - public RemoveResponseHeaderFilterFactory removeResponseHeaderFilterFactory() { - return new RemoveResponseHeaderFilterFactory(); + public RemoveResponseHeaderRouteFilter removeResponseHeaderRouteFilter() { + return new RemoveResponseHeaderRouteFilter(); } @Bean - public RewritePathFilterFactory rewritePathFilterFactory() { - return new RewritePathFilterFactory(); + public RewritePathRouteFilter rewritePathRouteFilter() { + return new RewritePathRouteFilter(); } @Bean - public SetPathFilterFactory setPathFilterFactory() { - return new SetPathFilterFactory(); + public SetPathRouteFilter setPathRouteFilter() { + return new SetPathRouteFilter(); } @Bean - public SetResponseHeaderFilterFactory setResponseHeaderFilterFactory() { - return new SetResponseHeaderFilterFactory(); + public SetResponseHeaderRouteFilter setResponseHeaderRouteFilter() { + return new SetResponseHeaderRouteFilter(); } @Bean - public SetStatusFilterFactory setStatusFilterFactory() { - return new SetStatusFilterFactory(); + public SetStatusRouteFilter setStatusRouteFilter() { + return new SetStatusRouteFilter(); } @Configuration diff --git a/src/main/java/org/springframework/cloud/gateway/filter/OrderedGatewayFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/OrderedGatewayFilter.java deleted file mode 100644 index 865ab78d..00000000 --- a/src/main/java/org/springframework/cloud/gateway/filter/OrderedGatewayFilter.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.springframework.cloud.gateway.filter; - -import org.springframework.core.Ordered; -import org.springframework.web.server.ServerWebExchange; -import org.springframework.web.server.WebFilterChain; -import reactor.core.publisher.Mono; - -/** - * @author Spencer Gibb - */ -public class OrderedGatewayFilter implements GatewayFilter, Ordered { - - private final GatewayFilter delegate; - private final int order; - - public OrderedGatewayFilter(GatewayFilter delegate, int order) { - this.delegate = delegate; - this.order = order; - } - - @Override - public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { - return this.delegate.filter(exchange, chain); - } - - @Override - public int getOrder() { - return this.order; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("OrderedGatewayFilter{"); - sb.append("delegate=").append(delegate); - sb.append(", order=").append(order); - sb.append('}'); - return sb.toString(); - } -} diff --git a/src/main/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderFilterFactory.java b/src/main/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderFilterFactory.java deleted file mode 100644 index b5821fbb..00000000 --- a/src/main/java/org/springframework/cloud/gateway/filter/factory/AddResponseHeaderFilterFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.springframework.cloud.gateway.filter.factory; - -import org.springframework.cloud.gateway.filter.GatewayFilter; - -/** - * @author Spencer Gibb - */ -public class AddResponseHeaderFilterFactory implements FilterFactory { - - @Override - public GatewayFilter apply(String header, String[] args) { - validate(args, 1); - - //TODO: caching can happen here - return (exchange, chain) -> { - exchange.getResponse().getHeaders().add(header, args[0]); - - return chain.filter(exchange); - }; - } -} diff --git a/src/main/java/org/springframework/cloud/gateway/filter/factory/FilterFactory.java b/src/main/java/org/springframework/cloud/gateway/filter/factory/FilterFactory.java deleted file mode 100644 index b401772b..00000000 --- a/src/main/java/org/springframework/cloud/gateway/filter/factory/FilterFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.springframework.cloud.gateway.filter.factory; - -import org.springframework.cloud.gateway.filter.GatewayFilter; -import org.springframework.util.Assert; - -/** - * @author Spencer Gibb - */ -public interface FilterFactory { - - default String getName() { - return getClass().getSimpleName().replace(FilterFactory.class.getSimpleName(), ""); - } - - GatewayFilter apply(String value, String[] args); - - default void validate(String[] args, int requiredSize) { - Assert.isTrue(args != null && args.length == requiredSize, - "args must have "+ requiredSize +" entry(s)"); - } -} diff --git a/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderFilterFactory.java b/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderFilterFactory.java deleted file mode 100644 index 16a7d215..00000000 --- a/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveResponseHeaderFilterFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.springframework.cloud.gateway.filter.factory; - -import org.springframework.cloud.gateway.filter.GatewayFilter; - -/** - * @author Spencer Gibb - */ -public class RemoveResponseHeaderFilterFactory implements FilterFactory { - - @Override - public GatewayFilter apply(String header, String[] args) { - - //TODO: caching can happen here - return (exchange, chain) -> { - exchange.getResponse().getHeaders().remove(header); - - return chain.filter(exchange); - }; - } -} diff --git a/src/main/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderFilterFactory.java b/src/main/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderFilterFactory.java deleted file mode 100644 index ebe31e20..00000000 --- a/src/main/java/org/springframework/cloud/gateway/filter/factory/SetResponseHeaderFilterFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.springframework.cloud.gateway.filter.factory; - -import org.springframework.cloud.gateway.filter.GatewayFilter; - -/** - * @author Spencer Gibb - */ -public class SetResponseHeaderFilterFactory implements FilterFactory { - - @Override - public GatewayFilter apply(String header, String[] args) { - validate(args, 1); - - //TODO: caching can happen here - return (exchange, chain) -> { - exchange.getResponse().getHeaders().set(header, args[0]); - - return chain.filter(exchange); - }; - } -} diff --git a/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderFilterFactory.java b/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestHeaderRouteFilter.java similarity index 60% rename from src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderFilterFactory.java rename to src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestHeaderRouteFilter.java index e420ddb9..e10ea350 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderFilterFactory.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/AddRequestHeaderRouteFilter.java @@ -1,15 +1,15 @@ -package org.springframework.cloud.gateway.filter.factory; +package org.springframework.cloud.gateway.filter.route; -import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.web.server.WebFilter; import org.springframework.http.server.reactive.ServerHttpRequest; /** * @author Spencer Gibb */ -public class AddRequestHeaderFilterFactory implements FilterFactory { +public class AddRequestHeaderRouteFilter implements RouteFilter { @Override - public GatewayFilter apply(String header, String[] args) { + public WebFilter apply(String header, String[] args) { validate(args, 1); //TODO: caching can happen here diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/AddResponseHeaderRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/AddResponseHeaderRouteFilter.java new file mode 100644 index 00000000..82865768 --- /dev/null +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/AddResponseHeaderRouteFilter.java @@ -0,0 +1,21 @@ +package org.springframework.cloud.gateway.filter.route; + +import org.springframework.web.server.WebFilter; + +/** + * @author Spencer Gibb + */ +public class AddResponseHeaderRouteFilter implements RouteFilter { + + @Override + public WebFilter apply(String header, String[] args) { + validate(args, 1); + + //TODO: caching can happen here + return (exchange, chain) -> { + exchange.getResponse().getHeaders().add(header, args[0]); + + return chain.filter(exchange); + }; + } +} diff --git a/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderFilterFactory.java b/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveRequestHeaderRouteFilter.java similarity index 68% rename from src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderFilterFactory.java rename to src/main/java/org/springframework/cloud/gateway/filter/route/RemoveRequestHeaderRouteFilter.java index 3e0e4556..344a03a3 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/factory/RemoveRequestHeaderFilterFactory.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveRequestHeaderRouteFilter.java @@ -1,17 +1,17 @@ -package org.springframework.cloud.gateway.filter.factory; +package org.springframework.cloud.gateway.filter.route; -import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.web.server.WebFilter; import org.springframework.http.server.reactive.ServerHttpRequest; /** * @author Spencer Gibb */ -public class RemoveRequestHeaderFilterFactory implements FilterFactory { +public class RemoveRequestHeaderRouteFilter implements RouteFilter { public static final String FAKE_HEADER = "_______force_______"; @Override - public GatewayFilter apply(String header, String[] args) { + public WebFilter apply(String header, String[] args) { //TODO: caching can happen here return (exchange, chain) -> { diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveResponseHeaderRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveResponseHeaderRouteFilter.java new file mode 100644 index 00000000..3d7bd8fc --- /dev/null +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/RemoveResponseHeaderRouteFilter.java @@ -0,0 +1,20 @@ +package org.springframework.cloud.gateway.filter.route; + +import org.springframework.web.server.WebFilter; + +/** + * @author Spencer Gibb + */ +public class RemoveResponseHeaderRouteFilter implements RouteFilter { + + @Override + public WebFilter apply(String header, String[] args) { + + //TODO: caching can happen here + return (exchange, chain) -> { + exchange.getResponse().getHeaders().remove(header); + + return chain.filter(exchange); + }; + } +} diff --git a/src/main/java/org/springframework/cloud/gateway/filter/factory/RewritePathFilterFactory.java b/src/main/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilter.java similarity index 69% rename from src/main/java/org/springframework/cloud/gateway/filter/factory/RewritePathFilterFactory.java rename to src/main/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilter.java index caee21b1..42cffabd 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/factory/RewritePathFilterFactory.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilter.java @@ -1,15 +1,15 @@ -package org.springframework.cloud.gateway.filter.factory; +package org.springframework.cloud.gateway.filter.route; -import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.web.server.WebFilter; import org.springframework.http.server.reactive.ServerHttpRequest; /** * @author Spencer Gibb */ -public class RewritePathFilterFactory implements FilterFactory { +public class RewritePathRouteFilter implements RouteFilter { @Override - public GatewayFilter apply(String regex, String[] args) { + public WebFilter apply(String regex, String[] args) { validate(args, 1); String replacement = args[0].replace("$\\", "$"); diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/RouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/RouteFilter.java new file mode 100644 index 00000000..7e484107 --- /dev/null +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/RouteFilter.java @@ -0,0 +1,21 @@ +package org.springframework.cloud.gateway.filter.route; + +import org.springframework.util.Assert; +import org.springframework.web.server.WebFilter; + +/** + * @author Spencer Gibb + */ +public interface RouteFilter { + + default String getName() { + return getClass().getSimpleName().replace(RouteFilter.class.getSimpleName(), ""); + } + + WebFilter apply(String value, String[] args); + + default void validate(String[] args, int requiredSize) { + Assert.isTrue(args != null && args.length == requiredSize, + "args must have "+ requiredSize +" entry(s)"); + } +} diff --git a/src/main/java/org/springframework/cloud/gateway/filter/factory/SetPathFilterFactory.java b/src/main/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilter.java similarity index 79% rename from src/main/java/org/springframework/cloud/gateway/filter/factory/SetPathFilterFactory.java rename to src/main/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilter.java index c9de95a6..ee63181a 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/factory/SetPathFilterFactory.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilter.java @@ -1,9 +1,9 @@ -package org.springframework.cloud.gateway.filter.factory; +package org.springframework.cloud.gateway.filter.route; import java.net.URI; import java.util.Map; -import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.web.server.WebFilter; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.util.UriTemplate; @@ -13,11 +13,11 @@ import static org.springframework.cloud.gateway.handler.predicate.UrlPredicateFa /** * @author Spencer Gibb */ -public class SetPathFilterFactory implements FilterFactory { +public class SetPathRouteFilter implements RouteFilter { @Override @SuppressWarnings("unchecked") - public GatewayFilter apply(String template, String[] args) { + public WebFilter apply(String template, String[] args) { UriTemplate uriTemplate = new UriTemplate(template); //TODO: caching can happen here diff --git a/src/main/java/org/springframework/cloud/gateway/filter/route/SetResponseHeaderRouteFilter.java b/src/main/java/org/springframework/cloud/gateway/filter/route/SetResponseHeaderRouteFilter.java new file mode 100644 index 00000000..477c84ff --- /dev/null +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/SetResponseHeaderRouteFilter.java @@ -0,0 +1,21 @@ +package org.springframework.cloud.gateway.filter.route; + +import org.springframework.web.server.WebFilter; + +/** + * @author Spencer Gibb + */ +public class SetResponseHeaderRouteFilter implements RouteFilter { + + @Override + public WebFilter apply(String header, String[] args) { + validate(args, 1); + + //TODO: caching can happen here + return (exchange, chain) -> { + exchange.getResponse().getHeaders().set(header, args[0]); + + return chain.filter(exchange); + }; + } +} diff --git a/src/main/java/org/springframework/cloud/gateway/filter/factory/SetStatusFilterFactory.java b/src/main/java/org/springframework/cloud/gateway/filter/route/SetStatusRouteFilter.java similarity index 75% rename from src/main/java/org/springframework/cloud/gateway/filter/factory/SetStatusFilterFactory.java rename to src/main/java/org/springframework/cloud/gateway/filter/route/SetStatusRouteFilter.java index 8d67f02f..a12e8441 100644 --- a/src/main/java/org/springframework/cloud/gateway/filter/factory/SetStatusFilterFactory.java +++ b/src/main/java/org/springframework/cloud/gateway/filter/route/SetStatusRouteFilter.java @@ -1,6 +1,6 @@ -package org.springframework.cloud.gateway.filter.factory; +package org.springframework.cloud.gateway.filter.route; -import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.web.server.WebFilter; import org.springframework.http.HttpStatus; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @@ -8,10 +8,10 @@ import reactor.core.publisher.Mono; /** * @author Spencer Gibb */ -public class SetStatusFilterFactory implements FilterFactory { +public class SetStatusRouteFilter implements RouteFilter { @Override - public GatewayFilter apply(String statusString, String[] args) { + public WebFilter apply(String statusString, String[] args) { HttpStatus httpStatus; try { diff --git a/src/main/java/org/springframework/cloud/gateway/handler/GatewayFilteringWebHandler.java b/src/main/java/org/springframework/cloud/gateway/handler/GatewayFilteringWebHandler.java index 2a0d6e0a..c449973e 100644 --- a/src/main/java/org/springframework/cloud/gateway/handler/GatewayFilteringWebHandler.java +++ b/src/main/java/org/springframework/cloud/gateway/handler/GatewayFilteringWebHandler.java @@ -18,6 +18,7 @@ package org.springframework.cloud.gateway.handler; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -29,10 +30,11 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.cloud.gateway.config.Route; import org.springframework.cloud.gateway.filter.GatewayFilter; -import org.springframework.cloud.gateway.filter.OrderedGatewayFilter; -import org.springframework.cloud.gateway.filter.factory.FilterFactory; +import org.springframework.cloud.gateway.filter.route.RouteFilter; +import org.springframework.core.Ordered; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import org.springframework.web.server.WebHandler; import org.springframework.web.server.handler.WebHandlerDecorator; @@ -53,10 +55,10 @@ public class GatewayFilteringWebHandler extends WebHandlerDecorator { protected final Log logger = LogFactory.getLog(getClass()); private final List filters; - private final Map filterDefinitions = new HashMap<>(); + private final Map filterDefinitions = new HashMap<>(); public GatewayFilteringWebHandler(WebHandler targetHandler, List filters, - List filterDefinitions) { + List filterDefinitions) { super(targetHandler); this.filters = initList(filters); initList(filterDefinitions).forEach(def -> this.filterDefinitions.put(def.getName(), def)); @@ -76,7 +78,7 @@ public class GatewayFilteringWebHandler extends WebHandlerDecorator { @Override public Mono handle(ServerWebExchange exchange) { //TODO: probably a java 8 stream way of doing this - ArrayList routeFilters = new ArrayList<>(this.filters); + ArrayList routeFilters = new ArrayList<>(loadGatewayFilters(this.filters)); Optional route = exchange.getAttribute(GATEWAY_ROUTE_ATTR); if (route.isPresent() && !route.get().getFilters().isEmpty()) { @@ -88,12 +90,24 @@ public class GatewayFilteringWebHandler extends WebHandlerDecorator { return new DefaultWebFilterChain(routeFilters, getDelegate()).filter(exchange); } - private List loadFilters(Route route) { - List filters = route.getFilters().stream() + private Collection loadGatewayFilters(List filters) { + return filters.stream() + .map(filter -> { + GatewayWebFilter webFilter = new GatewayWebFilter(filter); + if (filter instanceof Ordered) { + int order = ((Ordered) filter).getOrder(); + return new OrderedWebFilter(webFilter, order); + } + return webFilter; + }).collect(Collectors.toList()); + } + + private List loadFilters(Route route) { + List filters = route.getFilters().stream() .map(definition -> { - FilterFactory filter = this.filterDefinitions.get(definition.getName()); + RouteFilter filter = this.filterDefinitions.get(definition.getName()); if (filter == null) { - throw new IllegalArgumentException("Unable to find FilterFactory with name " + definition.getName()); + throw new IllegalArgumentException("Unable to find RouteFilter with name " + definition.getName()); } if (logger.isDebugEnabled()) { List args; @@ -109,22 +123,73 @@ public class GatewayFilteringWebHandler extends WebHandlerDecorator { }) .collect(Collectors.toList()); - ArrayList ordered = new ArrayList<>(filters.size()); + ArrayList ordered = new ArrayList<>(filters.size()); for (int i = 0; i < filters.size(); i++) { - ordered.add(new OrderedGatewayFilter(filters.get(i), i+1)); + ordered.add(new OrderedWebFilter(filters.get(i), i+1)); } return ordered; } + private static class GatewayWebFilter implements WebFilter { + + private final GatewayFilter delegate; + + public GatewayWebFilter(GatewayFilter delegate) { + this.delegate = delegate; + } + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + return this.delegate.filter(exchange, chain); + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("GatewayWebFilter{"); + sb.append("delegate=").append(delegate); + sb.append('}'); + return sb.toString(); + } + } + + public class OrderedWebFilter implements WebFilter, Ordered { + + private final WebFilter delegate; + private final int order; + + public OrderedWebFilter(WebFilter delegate, int order) { + this.delegate = delegate; + this.order = order; + } + + @Override + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + return this.delegate.filter(exchange, chain); + } + + @Override + public int getOrder() { + return this.order; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("OrderedWebFilter{"); + sb.append("delegate=").append(delegate); + sb.append(", order=").append(order); + sb.append('}'); + return sb.toString(); + } + } private static class DefaultWebFilterChain implements WebFilterChain { private int index; - private final List filters; + private final List filters; private final WebHandler delegate; - public DefaultWebFilterChain(List filters, WebHandler delegate) { + public DefaultWebFilterChain(List filters, WebHandler delegate) { this.filters = filters; this.delegate = delegate; } @@ -132,7 +197,7 @@ public class GatewayFilteringWebHandler extends WebHandlerDecorator { @Override public Mono filter(ServerWebExchange exchange) { if (this.index < filters.size()) { - GatewayFilter filter = filters.get(this.index++); + WebFilter filter = filters.get(this.index++); return filter.filter(exchange, this); } else { diff --git a/src/test/java/org/springframework/cloud/gateway/filter/factory/RewritePathFilterFactoryTests.java b/src/test/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilterTests.java similarity index 85% rename from src/test/java/org/springframework/cloud/gateway/filter/factory/RewritePathFilterFactoryTests.java rename to src/test/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilterTests.java index 2685be06..0207d7f1 100644 --- a/src/test/java/org/springframework/cloud/gateway/filter/factory/RewritePathFilterFactoryTests.java +++ b/src/test/java/org/springframework/cloud/gateway/filter/route/RewritePathRouteFilterTests.java @@ -1,9 +1,9 @@ -package org.springframework.cloud.gateway.filter.factory; +package org.springframework.cloud.gateway.filter.route; import org.assertj.core.api.Assertions; import org.junit.Test; import org.mockito.ArgumentCaptor; -import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.web.server.WebFilter; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.http.server.reactive.MockServerHttpResponse; import org.springframework.web.server.ServerWebExchange; @@ -17,7 +17,7 @@ import static org.mockito.Mockito.when; /** * @author Spencer Gibb */ -public class RewritePathFilterFactoryTests { +public class RewritePathRouteFilterTests { @Test public void rewritePathFilterWorks() { @@ -30,7 +30,7 @@ public class RewritePathFilterFactoryTests { } private void testRewriteFilter(String regex, String replacement, String actualPath, String expectedPath) { - GatewayFilter filter = new RewritePathFilterFactory().apply(regex, new String[]{replacement}); + WebFilter filter = new RewritePathRouteFilter().apply(regex, new String[]{replacement}); MockServerHttpRequest request = MockServerHttpRequest .get("http://localhost"+ actualPath) diff --git a/src/test/java/org/springframework/cloud/gateway/filter/factory/SetPathFilterFactoryTests.java b/src/test/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilterTests.java similarity index 88% rename from src/test/java/org/springframework/cloud/gateway/filter/factory/SetPathFilterFactoryTests.java rename to src/test/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilterTests.java index 355c01b4..c7bf85fe 100644 --- a/src/test/java/org/springframework/cloud/gateway/filter/factory/SetPathFilterFactoryTests.java +++ b/src/test/java/org/springframework/cloud/gateway/filter/route/SetPathRouteFilterTests.java @@ -1,13 +1,15 @@ -package org.springframework.cloud.gateway.filter.factory; +package org.springframework.cloud.gateway.filter.route; + +import java.util.HashMap; import org.assertj.core.api.Assertions; import org.junit.Test; import org.mockito.ArgumentCaptor; -import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.handler.predicate.UrlPredicateFactory; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.http.server.reactive.MockServerHttpResponse; import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import org.springframework.web.server.adapter.DefaultServerWebExchange; @@ -16,12 +18,10 @@ import static org.mockito.Mockito.when; import reactor.core.publisher.Mono; -import java.util.HashMap; - /** * @author Spencer Gibb */ -public class SetPathFilterFactoryTests { +public class SetPathRouteFilterTests { @Test public void rewritePathFilterWorks() { @@ -37,7 +37,7 @@ public class SetPathFilterFactoryTests { } private void testRewriteFilter(String template, String actualPath, String expectedPath, HashMap variables) { - GatewayFilter filter = new SetPathFilterFactory().apply(template, new String[]{}); + WebFilter filter = new SetPathRouteFilter().apply(template, new String[]{}); MockServerHttpRequest request = MockServerHttpRequest .get("http://localhost"+ actualPath)