Merge branch '2.1.x'
This commit is contained in:
@@ -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<String, String> 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<String, String> 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> 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<Void> response = filter.filter(exchange, this.filterChain);
|
||||
response.subscribe(aVoid -> {
|
||||
|
||||
Reference in New Issue
Block a user