-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path23-dynamic-limits.php
More file actions
55 lines (44 loc) · 1.76 KB
/
Copy path23-dynamic-limits.php
File metadata and controls
55 lines (44 loc) · 1.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
/**
* Example 23: Dynamic Throttle Limits
*
* This example demonstrates how to use closures for throttle limits
* to provide different rate limits based on request properties (e.g. user role).
*
* Run: php examples/23-dynamic-limits.php
*/
declare(strict_types=1);
require __DIR__ . '/../vendor/autoload.php';
use Flowd\Phirewall\Config;
use Flowd\Phirewall\Http\Firewall;
use Flowd\Phirewall\Store\InMemoryCache;
use Nyholm\Psr7\ServerRequest;
use Psr\Http\Message\ServerRequestInterface;
echo "=== Dynamic Throttle Limits Example ===\n\n";
$cache = new InMemoryCache();
$config = new Config($cache);
$config->enableRateLimitHeaders();
// Dynamic limit: admins get 100 req/min, regular users get 5 req/min
$config->throttles->add(
'role-based',
fn(ServerRequestInterface $serverRequest): int => $serverRequest->getHeaderLine('X-Role') === 'admin' ? 100 : 5,
60,
fn(ServerRequestInterface $serverRequest): string => $serverRequest->getServerParams()['REMOTE_ADDR'] ?? '127.0.0.1'
);
$firewall = new Firewall($config);
echo "--- Regular user (limit: 5/min) ---\n";
for ($i = 1; $i <= 7; ++$i) {
$request = new ServerRequest('GET', '/api/data', [], null, '1.1', ['REMOTE_ADDR' => '10.0.0.1']);
$result = $firewall->decide($request);
$status = $result->isBlocked() ? 'BLOCKED' : 'PASS';
echo sprintf(" Request %d: %s\n", $i, $status);
}
echo "\n--- Admin user (limit: 100/min) ---\n";
for ($i = 1; $i <= 7; ++$i) {
$request = (new ServerRequest('GET', '/api/data', [], null, '1.1', ['REMOTE_ADDR' => '10.0.0.2']))
->withHeader('X-Role', 'admin');
$result = $firewall->decide($request);
$status = $result->isBlocked() ? 'BLOCKED' : 'PASS';
echo sprintf(" Request %d: %s\n", $i, $status);
}
echo "\n=== Example Complete ===\n";