class AbstractRequestRateLimiter
An implementation of PeekableRequestRateLimiterInterface that fits most use-cases.
@author Wouter de Jong <wouter@wouterj.nl>
Hierarchy
- class \Symfony\Component\HttpFoundation\RateLimiter\AbstractRequestRateLimiter implements \Symfony\Component\HttpFoundation\RateLimiter\PeekableRequestRateLimiterInterface
Expanded class hierarchy of AbstractRequestRateLimiter
File
-
vendor/
symfony/ http-foundation/ RateLimiter/ AbstractRequestRateLimiter.php, line 25
Namespace
Symfony\Component\HttpFoundation\RateLimiterView source
abstract class AbstractRequestRateLimiter implements PeekableRequestRateLimiterInterface {
public function consume(Request $request) : RateLimit {
return $this->doConsume($request, 1);
}
public function peek(Request $request) : RateLimit {
return $this->doConsume($request, 0);
}
private function doConsume(Request $request, int $tokens) : RateLimit {
$limiters = $this->getLimiters($request);
if (0 === \count($limiters)) {
$limiters = [
new NoLimiter(),
];
}
$minimalRateLimit = null;
foreach ($limiters as $limiter) {
$rateLimit = $limiter->consume($tokens);
$minimalRateLimit = $minimalRateLimit ? self::getMinimalRateLimit($minimalRateLimit, $rateLimit) : $rateLimit;
}
return $minimalRateLimit;
}
public function reset(Request $request) : void {
foreach ($this->getLimiters($request) as $limiter) {
$limiter->reset();
}
}
/**
* @return LimiterInterface[] a set of limiters using keys extracted from the request
*/
protected abstract function getLimiters(Request $request) : array;
private static function getMinimalRateLimit(RateLimit $first, RateLimit $second) : RateLimit {
if ($first->isAccepted() !== $second->isAccepted()) {
return $first->isAccepted() ? $second : $first;
}
$firstRemainingTokens = $first->getRemainingTokens();
$secondRemainingTokens = $second->getRemainingTokens();
if ($firstRemainingTokens === $secondRemainingTokens) {
return $first->getRetryAfter() < $second->getRetryAfter() ? $second : $first;
}
return $firstRemainingTokens > $secondRemainingTokens ? $second : $first;
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overriden Title |
---|---|---|---|---|
AbstractRequestRateLimiter::consume | public | function | Overrides RequestRateLimiterInterface::consume | |
AbstractRequestRateLimiter::doConsume | private | function | ||
AbstractRequestRateLimiter::getLimiters | abstract protected | function | ||
AbstractRequestRateLimiter::getMinimalRateLimit | private static | function | ||
AbstractRequestRateLimiter::peek | public | function | Overrides PeekableRequestRateLimiterInterface::peek | |
AbstractRequestRateLimiter::reset | public | function | Overrides RequestRateLimiterInterface::reset |