This commit is contained in:
team3
2026-06-03 22:05:20 +02:00
parent d7e8df6876
commit 40de56c27b
5119 changed files with 552560 additions and 24 deletions

View File

@@ -0,0 +1,55 @@
<?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 Symfony\Component\RateLimiter\Storage;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\RateLimiter\LimiterStateInterface;
/**
* @author Wouter de Jong <wouter@wouterj.nl>
*/
class CacheStorage implements StorageInterface
{
private CacheItemPoolInterface $pool;
public function __construct(CacheItemPoolInterface $pool)
{
$this->pool = $pool;
}
public function save(LimiterStateInterface $limiterState): void
{
$cacheItem = $this->pool->getItem(sha1($limiterState->getId()));
$cacheItem->set($limiterState);
if (null !== ($expireAfter = $limiterState->getExpirationTime())) {
$cacheItem->expiresAfter($expireAfter);
}
$this->pool->save($cacheItem);
}
public function fetch(string $limiterStateId): ?LimiterStateInterface
{
$cacheItem = $this->pool->getItem(sha1($limiterStateId));
$value = $cacheItem->get();
if ($value instanceof LimiterStateInterface) {
return $value;
}
return null;
}
public function delete(string $limiterStateId): void
{
$this->pool->deleteItem(sha1($limiterStateId));
}
}

View File

@@ -0,0 +1,61 @@
<?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 Symfony\Component\RateLimiter\Storage;
use Symfony\Component\RateLimiter\LimiterStateInterface;
/**
* @author Wouter de Jong <wouter@wouterj.nl>
*/
class InMemoryStorage implements StorageInterface
{
private array $buckets = [];
public function save(LimiterStateInterface $limiterState): void
{
$this->buckets[$limiterState->getId()] = [$this->getExpireAt($limiterState), serialize($limiterState)];
}
public function fetch(string $limiterStateId): ?LimiterStateInterface
{
if (!isset($this->buckets[$limiterStateId])) {
return null;
}
[$expireAt, $limiterState] = $this->buckets[$limiterStateId];
if (null !== $expireAt && $expireAt <= microtime(true)) {
unset($this->buckets[$limiterStateId]);
return null;
}
return unserialize($limiterState);
}
public function delete(string $limiterStateId): void
{
if (!isset($this->buckets[$limiterStateId])) {
return;
}
unset($this->buckets[$limiterStateId]);
}
private function getExpireAt(LimiterStateInterface $limiterState): ?float
{
if (null !== $expireSeconds = $limiterState->getExpirationTime()) {
return microtime(true) + $expireSeconds;
}
return $this->buckets[$limiterState->getId()][0] ?? null;
}
}

View File

@@ -0,0 +1,26 @@
<?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 Symfony\Component\RateLimiter\Storage;
use Symfony\Component\RateLimiter\LimiterStateInterface;
/**
* @author Wouter de Jong <wouter@wouterj.nl>
*/
interface StorageInterface
{
public function save(LimiterStateInterface $limiterState): void;
public function fetch(string $limiterStateId): ?LimiterStateInterface;
public function delete(string $limiterStateId): void;
}