|
21 | 21 | import java.util.concurrent.TimeUnit; |
22 | 22 | import java.util.function.Consumer; |
23 | 23 | import java.util.function.Function; |
| 24 | +import java.util.function.Supplier; |
24 | 25 |
|
25 | 26 | import io.github.bucket4j.Bandwidth; |
26 | 27 | import io.github.bucket4j.BucketConfiguration; |
@@ -65,14 +66,17 @@ public static HandlerFilterFunction<ServerResponse, ServerResponse> rateLimit( |
65 | 66 | Consumer<RateLimitConfig> configConsumer) { |
66 | 67 | RateLimitConfig config = new RateLimitConfig(); |
67 | 68 | configConsumer.accept(config); |
| 69 | + Supplier<CompletableFuture<BucketConfiguration>> configSupplier = () -> CompletableFuture |
| 70 | + .supplyAsync(() -> config.configurationBuilder.apply(config)); |
| 71 | + |
68 | 72 | return (request, next) -> { |
69 | 73 | AsyncProxyManager proxyManager = MvcUtils.getApplicationContext(request).getBean(AsyncProxyManager.class); |
70 | 74 | String key = config.getKeyResolver().apply(request); |
71 | 75 | if (!StringUtils.hasText(key)) { |
72 | 76 | // TODO: configurable empty key status code |
73 | 77 | return ServerResponse.status(HttpStatus.FORBIDDEN).build(); |
74 | 78 | } |
75 | | - AsyncBucketProxy bucket = proxyManager.builder().build(key, () -> config.configurationBuilder.apply(config)); |
| 79 | + AsyncBucketProxy bucket = proxyManager.builder().build(key, configSupplier); |
76 | 80 | CompletableFuture<ConsumptionProbe> bucketFuture = bucket.tryConsumeAndReturnRemaining(config.getTokens()); |
77 | 81 | ConsumptionProbe consumptionProbe; |
78 | 82 | if (config.getTimeout() != null) { |
|
0 commit comments