use of io.github.bucket4j.grid.jcache.JCache in project bucket4j-spring-boot-starter by MarcGiffing.
the class Bucket4JBaseConfiguration method buildFilterConfig.
public FilterConfiguration buildFilterConfig(Bucket4JConfiguration config, CacheManager cacheManager, ExpressionParser expressionParser, BeanFactory beanFactory) {
FilterConfiguration filterConfig = new FilterConfiguration();
filterConfig.setUrl(config.getUrl());
filterConfig.setOrder(config.getFilterOrder());
filterConfig.setStrategy(config.getStrategy());
filterConfig.setHttpResponseBody(config.getHttpResponseBody());
ProxyManager<String> buckets = Bucket4j.extension(JCache.class).proxyManagerForCache(jCache(config.getCacheName(), cacheManager));
config.getRateLimits().forEach(rl -> {
ConfigurationBuilder<?> configBuilder = Bucket4j.configurationBuilder();
for (BandWidthConfig bandWidth : rl.getBandwidths()) {
configBuilder = configBuilder.addLimit(Bandwidth.simple(bandWidth.getCapacity(), Duration.of(bandWidth.getTime(), bandWidth.getUnit())));
}
;
final ConfigurationBuilder<?> configBuilderToUse = configBuilder;
RateLimitCheck rlc = (servletRequest) -> {
boolean skipRateLimit = false;
if (rl.getSkipCondition() != null) {
skipRateLimit = skipCondition(rl, expressionParser, beanFactory).evalute(servletRequest);
}
if (rl.getExecuteCondition() != null && !skipRateLimit) {
skipRateLimit = !executeCondition(rl, expressionParser, beanFactory).evalute(servletRequest);
}
if (!skipRateLimit) {
String key = getKeyFilter(filterConfig.getUrl(), rl, expressionParser, beanFactory).key(servletRequest);
Bucket bucket = buckets.getProxy(key, () -> configBuilderToUse.buildConfiguration());
ConsumptionProbe probe = bucket.tryConsumeAndReturnRemaining(1);
return probe;
}
return null;
};
filterConfig.getRateLimitChecks().add(rlc);
});
return filterConfig;
}
Aggregations