Calls to filter(collection) will now transform non-Ordered filters to Ordered filters.
fixes gh-445
This commit is contained in:
@@ -20,12 +20,18 @@ import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import reactor.retry.Repeat;
|
||||
import reactor.retry.Retry;
|
||||
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilter;
|
||||
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
|
||||
@@ -59,9 +65,6 @@ import org.springframework.core.Ordered;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
import reactor.retry.Repeat;
|
||||
import reactor.retry.Retry;
|
||||
|
||||
/**
|
||||
* Applies specific filters to routes.
|
||||
*/
|
||||
@@ -109,17 +112,30 @@ public class GatewayFilterSpec extends UriSpec {
|
||||
* @return a {@link GatewayFilterSpec} that can be used to apply additional filters
|
||||
*/
|
||||
public GatewayFilterSpec filters(GatewayFilter... gatewayFilters) {
|
||||
this.routeBuilder.filters(gatewayFilters);
|
||||
List<GatewayFilter> filters = transformToOrderedFilters(Stream.of(gatewayFilters));
|
||||
this.routeBuilder.filters(filters);
|
||||
return this;
|
||||
}
|
||||
|
||||
public List<GatewayFilter> transformToOrderedFilters(Stream<GatewayFilter> stream) {
|
||||
return stream
|
||||
.map(filter -> {
|
||||
if (filter instanceof Ordered) {
|
||||
return filter;
|
||||
} else {
|
||||
return new OrderedGatewayFilter(filter, 0);
|
||||
}
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies the list of filters to the route.
|
||||
* @param gatewayFilters the filters to apply
|
||||
* @return a {@link GatewayFilterSpec} that can be used to apply additional filters
|
||||
*/
|
||||
public GatewayFilterSpec filters(Collection<GatewayFilter> gatewayFilters) {
|
||||
this.routeBuilder.filters(gatewayFilters);
|
||||
List<GatewayFilter> filters = transformToOrderedFilters(gatewayFilters.stream());
|
||||
this.routeBuilder.filters(filters);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,12 +39,33 @@ public class GatewayFilterSpecTests {
|
||||
|
||||
Route route = routeBuilder.build();
|
||||
assertThat(route.getFilters()).hasSize(1);
|
||||
GatewayFilter filter = route.getFilters().get(0);
|
||||
assertFilter(route.getFilters().get(0), type, order);
|
||||
}
|
||||
|
||||
private void assertFilter(GatewayFilter filter, Class<? extends GatewayFilter> type, int order) {
|
||||
assertThat(filter).isInstanceOf(type);
|
||||
Ordered ordered = (Ordered) filter;
|
||||
assertThat(ordered.getOrder()).isEqualTo(order);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFilters() {
|
||||
ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class);
|
||||
Route.AsyncBuilder routeBuilder = Route.async()
|
||||
.id("123")
|
||||
.uri("abc:123")
|
||||
.predicate(exchange -> true);
|
||||
RouteLocatorBuilder.Builder routes = new RouteLocatorBuilder(context).routes();
|
||||
GatewayFilterSpec spec = new GatewayFilterSpec(routeBuilder, routes);
|
||||
spec.filters(new MyUnorderedFilter(), new MyOrderedFilter());
|
||||
|
||||
Route route = routeBuilder.build();
|
||||
assertThat(route.getFilters()).hasSize(2);
|
||||
|
||||
assertFilter(route.getFilters().get(0), OrderedGatewayFilter.class, 0);
|
||||
assertFilter(route.getFilters().get(1), MyOrderedFilter.class, 1000);
|
||||
}
|
||||
|
||||
protected static class MyOrderedFilter implements GatewayFilter, Ordered {
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
||||
|
||||
Reference in New Issue
Block a user