Merge branch '2.1.x'

This commit is contained in:
Tim Ysewyn
2019-07-30 21:22:22 +02:00
2 changed files with 40 additions and 30 deletions

View File

@@ -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;
}
}
}

View File

@@ -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 -> {