Skip to content

Commit 8393a23

Browse files
committed
Fixes ClassCastException in Bucket4jFilterFunctions.rateLimit()
Creates explicit `Supplier<CompletableFuture<BucketConfiguration>>` Moves creation of configSupplier to creation of HandlerFilterFunction rather than at runtime. Fixes gh-3983
1 parent 2708f53 commit 8393a23

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

spring-cloud-gateway-server-webmvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/Bucket4jFilterFunctions.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.concurrent.TimeUnit;
2222
import java.util.function.Consumer;
2323
import java.util.function.Function;
24+
import java.util.function.Supplier;
2425

2526
import io.github.bucket4j.Bandwidth;
2627
import io.github.bucket4j.BucketConfiguration;
@@ -65,14 +66,17 @@ public static HandlerFilterFunction<ServerResponse, ServerResponse> rateLimit(
6566
Consumer<RateLimitConfig> configConsumer) {
6667
RateLimitConfig config = new RateLimitConfig();
6768
configConsumer.accept(config);
69+
Supplier<CompletableFuture<BucketConfiguration>> configSupplier = () -> CompletableFuture
70+
.supplyAsync(() -> config.configurationBuilder.apply(config));
71+
6872
return (request, next) -> {
6973
AsyncProxyManager proxyManager = MvcUtils.getApplicationContext(request).getBean(AsyncProxyManager.class);
7074
String key = config.getKeyResolver().apply(request);
7175
if (!StringUtils.hasText(key)) {
7276
// TODO: configurable empty key status code
7377
return ServerResponse.status(HttpStatus.FORBIDDEN).build();
7478
}
75-
AsyncBucketProxy bucket = proxyManager.builder().build(key, () -> config.configurationBuilder.apply(config));
79+
AsyncBucketProxy bucket = proxyManager.builder().build(key, configSupplier);
7680
CompletableFuture<ConsumptionProbe> bucketFuture = bucket.tryConsumeAndReturnRemaining(config.getTokens());
7781
ConsumptionProbe consumptionProbe;
7882
if (config.getTimeout() != null) {

0 commit comments

Comments
 (0)