Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. AbstractRequestRateLimiter.php

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\RateLimiter
View 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

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal