PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.12.1
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.12.1
5.12.1 5.12.0 5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / vendor / prefixed / symfony / http-foundation / RateLimiter / AbstractRequestRateLimiter.php
matomo / app / vendor / prefixed / symfony / http-foundation / RateLimiter Last commit date
AbstractRequestRateLimiter.php 2 years ago RequestRateLimiterInterface.php 2 years ago
AbstractRequestRateLimiter.php
61 lines
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11 namespace Matomo\Dependencies\Symfony\Component\HttpFoundation\RateLimiter;
12
13 use Matomo\Dependencies\Symfony\Component\HttpFoundation\Request;
14 use Symfony\Component\RateLimiter\LimiterInterface;
15 use Symfony\Component\RateLimiter\Policy\NoLimiter;
16 use Symfony\Component\RateLimiter\RateLimit;
17 /**
18 * An implementation of RequestRateLimiterInterface that
19 * fits most use-cases.
20 *
21 * @author Wouter de Jong <wouter@wouterj.nl>
22 */
23 abstract class AbstractRequestRateLimiter implements RequestRateLimiterInterface
24 {
25 public function consume(Request $request) : RateLimit
26 {
27 $limiters = $this->getLimiters($request);
28 if (0 === \count($limiters)) {
29 $limiters = [new NoLimiter()];
30 }
31 $minimalRateLimit = null;
32 foreach ($limiters as $limiter) {
33 $rateLimit = $limiter->consume(1);
34 $minimalRateLimit = $minimalRateLimit ? self::getMinimalRateLimit($minimalRateLimit, $rateLimit) : $rateLimit;
35 }
36 return $minimalRateLimit;
37 }
38 public function reset(Request $request) : void
39 {
40 foreach ($this->getLimiters($request) as $limiter) {
41 $limiter->reset();
42 }
43 }
44 /**
45 * @return LimiterInterface[] a set of limiters using keys extracted from the request
46 */
47 protected abstract function getLimiters(Request $request) : array;
48 private static function getMinimalRateLimit(RateLimit $first, RateLimit $second) : RateLimit
49 {
50 if ($first->isAccepted() !== $second->isAccepted()) {
51 return $first->isAccepted() ? $second : $first;
52 }
53 $firstRemainingTokens = $first->getRemainingTokens();
54 $secondRemainingTokens = $second->getRemainingTokens();
55 if ($firstRemainingTokens === $secondRemainingTokens) {
56 return $first->getRetryAfter() < $second->getRetryAfter() ? $second : $first;
57 }
58 return $firstRemainingTokens > $secondRemainingTokens ? $second : $first;
59 }
60 }
61