Search in sources :

Example 1 with Route

use of org.springframework.cloud.gateway.route.Route in project spring-cloud-gateway by spring-cloud.

the class FilteringWebHandler method handle.

/* TODO: relocate @EventListener(RefreshRoutesEvent.class)
    void handleRefresh() {
        this.combinedFiltersForRoute.clear();
    }*/
@Override
public Mono<Void> handle(ServerWebExchange exchange) {
    Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
    List<GatewayFilter> gatewayFilters = route.getFilters();
    List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
    combined.addAll(gatewayFilters);
    // TODO: needed or cached?
    AnnotationAwareOrderComparator.sort(combined);
    logger.debug("Sorted gatewayFilterFactories: " + combined);
    return new DefaultGatewayFilterChain(combined).filter(exchange);
}
Also used : ArrayList(java.util.ArrayList) Route(org.springframework.cloud.gateway.route.Route) OrderedGatewayFilter(org.springframework.cloud.gateway.filter.OrderedGatewayFilter) GatewayFilter(org.springframework.cloud.gateway.filter.GatewayFilter)

Example 2 with Route

use of org.springframework.cloud.gateway.route.Route in project spring-cloud-gateway by spring-cloud.

the class RequestRateLimiterGatewayFilterFactory method apply.

@SuppressWarnings("unchecked")
@Override
public GatewayFilter apply(Config config) {
    KeyResolver resolver = (config.keyResolver == null) ? defaultKeyResolver : config.keyResolver;
    RateLimiter<Object> limiter = (config.rateLimiter == null) ? defaultRateLimiter : config.rateLimiter;
    return (exchange, chain) -> {
        Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
        return resolver.resolve(exchange).flatMap(key -> limiter.isAllowed(route.getId(), key).flatMap(response -> {
            if (response.isAllowed()) {
                return chain.filter(exchange);
            }
            exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
            return exchange.getResponse().setComplete();
        }));
    };
}
Also used : HttpStatus(org.springframework.http.HttpStatus) ServerWebExchangeUtils(org.springframework.cloud.gateway.support.ServerWebExchangeUtils) RateLimiter(org.springframework.cloud.gateway.filter.ratelimit.RateLimiter) GatewayFilter(org.springframework.cloud.gateway.filter.GatewayFilter) KeyResolver(org.springframework.cloud.gateway.filter.ratelimit.KeyResolver) Route(org.springframework.cloud.gateway.route.Route) KeyResolver(org.springframework.cloud.gateway.filter.ratelimit.KeyResolver) Route(org.springframework.cloud.gateway.route.Route)

Example 3 with Route

use of org.springframework.cloud.gateway.route.Route in project spring-cloud-gateway by spring-cloud.

the class RouteToRequestUrlFilterTests method testFilter.

private ServerWebExchange testFilter(MockServerHttpRequest request, String url) {
    Route value = Route.builder().id("1").uri(URI.create(url)).order(0).predicate(swe -> true).build();
    ServerWebExchange exchange = MockServerWebExchange.from(request);
    exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, value);
    GatewayFilterChain filterChain = mock(GatewayFilterChain.class);
    ArgumentCaptor<ServerWebExchange> captor = ArgumentCaptor.forClass(ServerWebExchange.class);
    when(filterChain.filter(captor.capture())).thenReturn(Mono.empty());
    RouteToRequestUrlFilter filter = new RouteToRequestUrlFilter();
    filter.filter(exchange, filterChain);
    return captor.getValue();
}
Also used : UriComponentsBuilder(org.springframework.web.util.UriComponentsBuilder) MockServerHttpRequest(org.springframework.mock.http.server.reactive.MockServerHttpRequest) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) HttpMethod(org.springframework.http.HttpMethod) Test(org.junit.Test) Mono(reactor.core.publisher.Mono) Mockito.when(org.mockito.Mockito.when) ServerWebExchange(org.springframework.web.server.ServerWebExchange) ArgumentCaptor(org.mockito.ArgumentCaptor) GATEWAY_REQUEST_URL_ATTR(org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR) GATEWAY_ROUTE_ATTR(org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR) GATEWAY_SCHEME_PREFIX_ATTR(org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR) MockServerWebExchange(org.springframework.mock.web.server.MockServerWebExchange) URI(java.net.URI) Collections(java.util.Collections) Route(org.springframework.cloud.gateway.route.Route) Mockito.mock(org.mockito.Mockito.mock) ServerWebExchange(org.springframework.web.server.ServerWebExchange) MockServerWebExchange(org.springframework.mock.web.server.MockServerWebExchange) Route(org.springframework.cloud.gateway.route.Route)

Example 4 with Route

use of org.springframework.cloud.gateway.route.Route in project spring-cloud-gateway by spring-cloud.

the class RedisRateLimiterConfigTests method assertFilter.

private void assertFilter(String key, int replenishRate, int burstCapacity, boolean useDefaultConfig) {
    RedisRateLimiter.Config config;
    if (useDefaultConfig) {
        config = rateLimiter.getDefaultConfig();
    } else {
        assertThat(rateLimiter.getConfig()).containsKey(key);
        config = rateLimiter.getConfig().get(key);
    }
    assertThat(config).isNotNull();
    assertThat(config.getReplenishRate()).isEqualTo(replenishRate);
    assertThat(config.getBurstCapacity()).isEqualTo(burstCapacity);
    Route route = routeLocator.getRoutes().filter(r -> r.getId().equals(key)).next().block();
    assertThat(route).isNotNull();
    assertThat(route.getFilters()).hasSize(1);
}
Also used : Route(org.springframework.cloud.gateway.route.Route)

Example 5 with Route

use of org.springframework.cloud.gateway.route.Route in project spring-cloud-gateway by spring-cloud.

the class GatewayFilterSpecTests method testFilter.

private void testFilter(Class<? extends GatewayFilter> type, GatewayFilter gatewayFilter, int order) {
    ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class);
    Route.Builder routeBuilder = Route.builder().id("123").uri("abc:123").predicate(exchange -> true);
    RouteLocatorBuilder.Builder routes = new RouteLocatorBuilder(context).routes();
    GatewayFilterSpec spec = new GatewayFilterSpec(routeBuilder, routes);
    spec.filter(gatewayFilter);
    Route route = routeBuilder.build();
    assertThat(route.getFilters()).hasSize(1);
    GatewayFilter filter = route.getFilters().get(0);
    assertThat(filter).isInstanceOf(type);
    Ordered ordered = (Ordered) filter;
    assertThat(ordered.getOrder()).isEqualTo(order);
}
Also used : ConfigurableApplicationContext(org.springframework.context.ConfigurableApplicationContext) Ordered(org.springframework.core.Ordered) Route(org.springframework.cloud.gateway.route.Route) GatewayFilter(org.springframework.cloud.gateway.filter.GatewayFilter) OrderedGatewayFilter(org.springframework.cloud.gateway.filter.OrderedGatewayFilter)

Aggregations

Route (org.springframework.cloud.gateway.route.Route)6 GatewayFilter (org.springframework.cloud.gateway.filter.GatewayFilter)3 URI (java.net.URI)2 OrderedGatewayFilter (org.springframework.cloud.gateway.filter.OrderedGatewayFilter)2 ArrayList (java.util.ArrayList)1 Collections (java.util.Collections)1 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)1 Test (org.junit.Test)1 ArgumentCaptor (org.mockito.ArgumentCaptor)1 Mockito.mock (org.mockito.Mockito.mock)1 Mockito.when (org.mockito.Mockito.when)1 KeyResolver (org.springframework.cloud.gateway.filter.ratelimit.KeyResolver)1 RateLimiter (org.springframework.cloud.gateway.filter.ratelimit.RateLimiter)1 ServerWebExchangeUtils (org.springframework.cloud.gateway.support.ServerWebExchangeUtils)1 GATEWAY_REQUEST_URL_ATTR (org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR)1 GATEWAY_ROUTE_ATTR (org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR)1 GATEWAY_SCHEME_PREFIX_ATTR (org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR)1 ConfigurableApplicationContext (org.springframework.context.ConfigurableApplicationContext)1 Ordered (org.springframework.core.Ordered)1 HttpMethod (org.springframework.http.HttpMethod)1