Вход Регистрация
Файл: vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php
Строк: 112
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentHttpFoundationRateLimiter;

use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentRateLimiterLimiterInterface;
use 
SymfonyComponentRateLimiterPolicyNoLimiter;
use 
SymfonyComponentRateLimiterRateLimit;

/**
 * An implementation of PeekableRequestRateLimiterInterface that
 * fits most use-cases.
 *
 * @author Wouter de Jong <wouter@wouterj.nl>
 */
abstract class AbstractRequestRateLimiter implements PeekableRequestRateLimiterInterface
{
    public function 
consume(Request $request): RateLimit
    
{
        return 
$this->doConsume($request1);
    }

    public function 
peek(Request $request): RateLimit
    
{
        return 
$this->doConsume($request0);
    }

    private function 
doConsume(Request $requestint $tokens): RateLimit
    
{
        
$limiters $this->getLimiters($request);
        if (
=== 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
     */
    
abstract protected function getLimiters(Request $request): array;

    private static function 
getMinimalRateLimit(RateLimit $firstRateLimit $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;
    }
}
Онлайн: 0
Реклама