Browse Source

Calls to filter(collection) will now transform non-Ordered filters to Ordered filters.

fixes gh-445
pull/515/head
Spencer Gibb 7 years ago
parent
commit
2bbf748fcd
No known key found for this signature in database
GPG Key ID: 7788A47380690861
  1. 26
      spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java
  2. 23
      spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpecTests.java

26
spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java

@ -20,12 +20,18 @@ import java.net.URI; @@ -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; @@ -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 { @@ -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;
}

23
spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpecTests.java

@ -39,12 +39,33 @@ public class GatewayFilterSpecTests { @@ -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) {

Loading…
Cancel
Save