|
13 | 13 | final class GlobalState |
14 | 14 | { |
15 | 15 | /** |
16 | | - * Sets ip-address, request-time and other values. |
17 | | - * |
18 | | - * @return non-empty-array<array-key|string, mixed|string> |
| 16 | + * @var array<array-key, mixed> Cached state of the $_SERVER superglobal. |
19 | 17 | */ |
20 | | - public static function populateServer(Request $request): array |
21 | | - { |
22 | | - /** @var non-empty-array<array-key|string, mixed|string>|null $originalServer */ |
23 | | - static $originalServer = null; |
| 18 | + private static array $cachedServer = []; |
24 | 19 |
|
25 | | - if ($originalServer == null) { |
26 | | - $originalServer = $_SERVER; |
27 | | - } |
| 20 | + /** |
| 21 | + * Cache superglobal $_SERVER to avoid state leaks between requests. |
| 22 | + */ |
| 23 | + public static function cacheServerVars(): void |
| 24 | + { |
| 25 | + self::$cachedServer = $_SERVER; |
| 26 | + } |
28 | 27 |
|
29 | | - $newServer = $originalServer; |
| 28 | + /** |
| 29 | + * Enrich cached $_SERVER with data from the request. |
| 30 | + * |
| 31 | + * @return non-empty-array<array-key, mixed> Cached $_SERVER data enriched with request data. |
| 32 | + */ |
| 33 | + public static function enrichServerVars(Request $request): array |
| 34 | + { |
| 35 | + $server = self::$cachedServer; |
30 | 36 |
|
31 | | - $newServer['REQUEST_URI'] = $request->uri; |
32 | | - $newServer['REQUEST_TIME'] = time(); |
33 | | - $newServer['REQUEST_TIME_FLOAT'] = microtime(true); |
34 | | - $newServer['REMOTE_ADDR'] = $request->getRemoteAddr(); |
35 | | - $newServer['REQUEST_METHOD'] = $request->method; |
36 | | - $newServer['HTTP_USER_AGENT'] = ''; |
| 37 | + $server['REQUEST_URI'] = $request->uri; |
| 38 | + $server['REQUEST_TIME'] = time(); |
| 39 | + $server['REQUEST_TIME_FLOAT'] = microtime(true); |
| 40 | + $server['REMOTE_ADDR'] = $request->getRemoteAddr(); |
| 41 | + $server['REQUEST_METHOD'] = $request->method; |
| 42 | + $server['HTTP_USER_AGENT'] = ''; |
37 | 43 |
|
38 | 44 | foreach ($request->headers as $key => $value) { |
39 | 45 | $key = strtoupper(str_replace('-', '_', $key)); |
40 | 46 |
|
41 | 47 | if ($key == 'CONTENT_TYPE' || $key == 'CONTENT_LENGTH') { |
42 | | - $newServer[$key] = implode(', ', $value); |
| 48 | + $server[$key] = implode(', ', $value); |
43 | 49 |
|
44 | 50 | continue; |
45 | 51 | } |
46 | 52 |
|
47 | | - $newServer['HTTP_' . $key] = implode(', ', $value); |
| 53 | + $server['HTTP_' . $key] = implode(', ', $value); |
48 | 54 | } |
49 | 55 |
|
50 | | - return $newServer; |
| 56 | + return $server; |
51 | 57 | } |
52 | 58 | } |
| 59 | + |
| 60 | +GlobalState::cacheServerVars(); |
0 commit comments