From 6e008e87c47c6bb9ce209e7bd49c919b1a93c258 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 29 Jul 2019 14:43:55 +0200 Subject: [PATCH 1/2] Added symbolic link of index.adoc --- docs/src/main/asciidoc/index.adoc | 1 + 1 file changed, 1 insertion(+) create mode 120000 docs/src/main/asciidoc/index.adoc diff --git a/docs/src/main/asciidoc/index.adoc b/docs/src/main/asciidoc/index.adoc new file mode 120000 index 00000000..8601cbb4 --- /dev/null +++ b/docs/src/main/asciidoc/index.adoc @@ -0,0 +1 @@ +spring-cloud-gateway.adoc \ No newline at end of file From 07c21a9e60403df77bdda38844003f75d1b87309 Mon Sep 17 00:00:00 2001 From: Tim Ysewyn Date: Tue, 30 Jul 2019 21:21:39 +0200 Subject: [PATCH 2/2] Support multiple rate-limiter configs Take the correct rate-limiter filter configuration into account in case there is a default and route-specific one. --- ...equestRateLimiterGatewayFilterFactory.java | 64 +++++++++++-------- ...tRateLimiterGatewayFilterFactoryTests.java | 6 +- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactory.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactory.java index 5f0f7f6d..cb94c082 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactory.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactory.java @@ -22,9 +22,8 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; import org.springframework.cloud.gateway.filter.ratelimit.RateLimiter; -import org.springframework.cloud.gateway.route.Route; +import org.springframework.cloud.gateway.support.HasRouteId; import org.springframework.cloud.gateway.support.HttpStatusHolder; -import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.http.HttpStatus; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.setResponseStatus; @@ -96,42 +95,39 @@ public class RequestRateLimiterGatewayFilterFactory extends HttpStatusHolder emptyKeyStatus = HttpStatusHolder .parse(getOrDefault(config.emptyKeyStatus, this.emptyKeyStatusCode)); - return (exchange, chain) -> { - Route route = exchange - .getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); - - return resolver.resolve(exchange).defaultIfEmpty(EMPTY_KEY).flatMap(key -> { - if (EMPTY_KEY.equals(key)) { - if (denyEmpty) { - setResponseStatus(exchange, emptyKeyStatus); - return exchange.getResponse().setComplete(); - } - return chain.filter(exchange); - } - return limiter.isAllowed(route.getId(), key).flatMap(response -> { - - for (Map.Entry header : response.getHeaders() - .entrySet()) { - exchange.getResponse().getHeaders().add(header.getKey(), - header.getValue()); - } - - if (response.isAllowed()) { + return (exchange, chain) -> resolver.resolve(exchange).defaultIfEmpty(EMPTY_KEY) + .flatMap(key -> { + if (EMPTY_KEY.equals(key)) { + if (denyEmpty) { + setResponseStatus(exchange, emptyKeyStatus); + return exchange.getResponse().setComplete(); + } return chain.filter(exchange); } + return limiter.isAllowed(config.getRouteId(), key) + .flatMap(response -> { - setResponseStatus(exchange, config.getStatusCode()); - return exchange.getResponse().setComplete(); + for (Map.Entry header : response + .getHeaders().entrySet()) { + exchange.getResponse().getHeaders() + .add(header.getKey(), header.getValue()); + } + + if (response.isAllowed()) { + return chain.filter(exchange); + } + + setResponseStatus(exchange, config.getStatusCode()); + return exchange.getResponse().setComplete(); + }); }); - }); - }; } private T getOrDefault(T configValue, T defaultValue) { return (configValue != null) ? configValue : defaultValue; } - public static class Config { + public static class Config implements HasRouteId { private KeyResolver keyResolver; @@ -143,6 +139,8 @@ public class RequestRateLimiterGatewayFilterFactory extends private String emptyKeyStatus; + private String routeId; + public KeyResolver getKeyResolver() { return keyResolver; } @@ -188,6 +186,16 @@ public class RequestRateLimiterGatewayFilterFactory extends return this; } + @Override + public void setRouteId(String routeId) { + this.routeId = routeId; + } + + @Override + public String getRouteId() { + return this.routeId; + } + } } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactoryTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactoryTests.java index 81bd975f..e2fe13aa 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/filter/factory/RequestRateLimiterGatewayFilterFactoryTests.java @@ -129,8 +129,10 @@ public class RequestRateLimiterGatewayFilterFactoryTests extends BaseWebClientTe if (denyEmptyKey != null) { factory.setDenyEmptyKey(denyEmptyKey); } - GatewayFilter filter = factory - .apply(config -> config.setKeyResolver(keyResolver)); + GatewayFilter filter = factory.apply(config -> { + config.setRouteId("myroute"); + config.setKeyResolver(keyResolver); + }); Mono response = filter.filter(exchange, this.filterChain); response.subscribe(aVoid -> {