Supports Ordered of GatewayFilters created by GatewayFilterFactory (#283)

* Support Ordered

* Add RouteDefinitionRouteLocatorTests
This commit is contained in:
Toshiaki Maki
2018-04-20 01:00:32 +09:00
committed by Spencer Gibb
parent b49e1e87b4
commit 64831fd568
2 changed files with 75 additions and 9 deletions

View File

@@ -43,6 +43,7 @@ import org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory
import org.springframework.cloud.gateway.support.ConfigurationUtils;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.validation.Validator;
@@ -162,7 +163,13 @@ public class RouteDefinitionRouteLocator implements RouteLocator, BeanFactoryAwa
ArrayList<GatewayFilter> ordered = new ArrayList<>(filters.size());
for (int i = 0; i < filters.size(); i++) {
ordered.add(new OrderedGatewayFilter(filters.get(i), i+1));
GatewayFilter gatewayFilter = filters.get(i);
if (gatewayFilter instanceof Ordered) {
ordered.add(gatewayFilter);
}
else {
ordered.add(new OrderedGatewayFilter(gatewayFilter, i + 1));
}
}
return ordered;

View File

@@ -1,21 +1,80 @@
package org.springframework.cloud.gateway.route;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.config.PropertiesRouteDefinitionLocator;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.AddResponseHeaderGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.RemoveResponseHeaderGatewayFilterFactory;
import org.springframework.cloud.gateway.handler.predicate.HostRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest
/**
* @author Toshiaki Maki
*/
public class RouteDefinitionRouteLocatorTests {
@Test
public void contextLoads() {
List<RoutePredicateFactory> predicates = Arrays
.asList(new HostRoutePredicateFactory());
List<GatewayFilterFactory> gatewayFilterFactories = Arrays.asList(
new RemoveResponseHeaderGatewayFilterFactory(),
new AddResponseHeaderGatewayFilterFactory(),
new TestOrderedGatewayFilterFactory());
GatewayProperties gatewayProperties = new GatewayProperties();
gatewayProperties.setRoutes(Arrays.asList(new RouteDefinition() {
{
setId("foo");
setUri(URI.create("http://foo.example.com"));
setPredicates(
Arrays.asList(new PredicateDefinition("Host=*.example.com")));
setFilters(Arrays.asList(
new FilterDefinition("RemoveResponseHeader=Server"),
new FilterDefinition("TestOrdered="),
new FilterDefinition("AddResponseHeader=X-Response-Foo, Bar")));
}
}));
RouteDefinitionRouteLocator routeDefinitionRouteLocator = new RouteDefinitionRouteLocator(
new PropertiesRouteDefinitionLocator(gatewayProperties), predicates,
gatewayFilterFactories, gatewayProperties);
List<Route> routes = routeDefinitionRouteLocator.getRoutes().collectList()
.block();
List<GatewayFilter> filters = routes.get(0).getFilters();
assertThat(filters).hasSize(3);
assertThat(getFilterClassName(filters.get(0))).startsWith("RemoveResponseHeader");
assertThat(getFilterClassName(filters.get(1))).startsWith("AddResponseHeader");
assertThat(getFilterClassName(filters.get(2)))
.startsWith("RouteDefinitionRouteLocatorTests$TestOrderedGateway");
}
@SpringBootConfiguration
protected static class TestConfig {
private String getFilterClassName(GatewayFilter target) {
if (target instanceof OrderedGatewayFilter) {
return getFilterClassName(((OrderedGatewayFilter) target).getDelegate());
}
else {
return target.getClass().getSimpleName();
}
}
static class TestOrderedGatewayFilterFactory extends AbstractGatewayFilterFactory {
@Override
public GatewayFilter apply(Object config) {
return new OrderedGatewayFilter((exchange, chain) -> chain.filter(exchange),
9999);
}
}
}