From 0831487eed3b51e8910c3fa77adb243b84349957 Mon Sep 17 00:00:00 2001 From: Vlad Shashkov Date: Thu, 26 Feb 2026 11:50:15 +0700 Subject: [PATCH 1/4] Added parse http host --- src/GlobalState.php | 11 +++++++++++ tests/Unit/PSR7WorkerTest.php | 2 ++ 2 files changed, 13 insertions(+) diff --git a/src/GlobalState.php b/src/GlobalState.php index 9303149..1fa28da 100644 --- a/src/GlobalState.php +++ b/src/GlobalState.php @@ -35,6 +35,17 @@ public static function enrichServerVars(Request $request): array $server['REQUEST_METHOD'] = $request->method; $server['HTTP_USER_AGENT'] = ''; + $host = parse_url($request->uri, PHP_URL_HOST); + $port = parse_url($request->uri, PHP_URL_PORT); + + if ($host != null) { + $server['HTTP_HOST'] = $host; + } + + if ($host != null && $port != null) { + $server['HTTP_HOST'] = $host . ':' . $port; + } + foreach ($request->headers as $key => $value) { $key = \strtoupper(\str_replace('-', '_', $key)); diff --git a/tests/Unit/PSR7WorkerTest.php b/tests/Unit/PSR7WorkerTest.php index 70d002e..52f8f7d 100644 --- a/tests/Unit/PSR7WorkerTest.php +++ b/tests/Unit/PSR7WorkerTest.php @@ -44,6 +44,7 @@ public function testStateServerLeak(): void 'HTTP_USER_AGENT' => '', 'CONTENT_TYPE' => 'application/html', 'HTTP_CONNECTION' => 'keep-alive', + 'HTTP_HOST' => 'localhost', ], ], [ @@ -56,6 +57,7 @@ public function testStateServerLeak(): void 'REQUEST_METHOD' => 'GET', 'HTTP_USER_AGENT' => '', 'CONTENT_TYPE' => 'application/json', + 'HTTP_HOST' => 'localhost', ], ], ]; From b45448e590deba8f690ab59bb9bc53b38c73906c Mon Sep 17 00:00:00 2001 From: Aleksei Gagarin Date: Thu, 26 Feb 2026 14:52:21 +0400 Subject: [PATCH 2/4] Optimize URL parsing --- src/GlobalState.php | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/GlobalState.php b/src/GlobalState.php index 1fa28da..bf493ec 100644 --- a/src/GlobalState.php +++ b/src/GlobalState.php @@ -35,17 +35,13 @@ public static function enrichServerVars(Request $request): array $server['REQUEST_METHOD'] = $request->method; $server['HTTP_USER_AGENT'] = ''; - $host = parse_url($request->uri, PHP_URL_HOST); - $port = parse_url($request->uri, PHP_URL_PORT); + $parts = \parse_url($uri); - if ($host != null) { - $server['HTTP_HOST'] = $host; + if (isset($parts['host'])) { + $server['HTTP_HOST'] = isset($parts['port']) + ? $parts['host'] . ':' . $parts['port'] + : $parts['host']; } - - if ($host != null && $port != null) { - $server['HTTP_HOST'] = $host . ':' . $port; - } - foreach ($request->headers as $key => $value) { $key = \strtoupper(\str_replace('-', '_', $key)); From 198a1b90dac98642359c478396d8c7cc27e08ff4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 26 Feb 2026 10:52:43 +0000 Subject: [PATCH 3/4] style(php-cs-fixer): fix coding standards --- src/GlobalState.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GlobalState.php b/src/GlobalState.php index bf493ec..427ade0 100644 --- a/src/GlobalState.php +++ b/src/GlobalState.php @@ -39,7 +39,7 @@ public static function enrichServerVars(Request $request): array if (isset($parts['host'])) { $server['HTTP_HOST'] = isset($parts['port']) - ? $parts['host'] . ':' . $parts['port'] + ? $parts['host'] . ':' . $parts['port'] : $parts['host']; } foreach ($request->headers as $key => $value) { From de02802b13b26d86a6ca7788703bed73ed80f102 Mon Sep 17 00:00:00 2001 From: Vlad Shashkov Date: Thu, 26 Feb 2026 18:15:44 +0700 Subject: [PATCH 4/4] Added test for GlobalState --- src/GlobalState.php | 2 +- tests/Unit/GlobalStateTest.php | 71 ++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 tests/Unit/GlobalStateTest.php diff --git a/src/GlobalState.php b/src/GlobalState.php index 427ade0..86d26b3 100644 --- a/src/GlobalState.php +++ b/src/GlobalState.php @@ -35,7 +35,7 @@ public static function enrichServerVars(Request $request): array $server['REQUEST_METHOD'] = $request->method; $server['HTTP_USER_AGENT'] = ''; - $parts = \parse_url($uri); + $parts = \parse_url($request->uri); if (isset($parts['host'])) { $server['HTTP_HOST'] = isset($parts['port']) diff --git a/tests/Unit/GlobalStateTest.php b/tests/Unit/GlobalStateTest.php new file mode 100644 index 0000000..5ca36d5 --- /dev/null +++ b/tests/Unit/GlobalStateTest.php @@ -0,0 +1,71 @@ +}> + */ + public static function enrichServerVarsDataProvider(): iterable + { + yield [ + new Request(), + [ + 'REQUEST_URI' => 'http://localhost', + 'REMOTE_ADDR' => '127.0.0.1', + 'REQUEST_METHOD' => 'GET', + 'HTTP_USER_AGENT' => '', + 'HTTP_HOST' => 'localhost', + ], + ]; + + yield [ + new Request(uri: 'https://roadrunner.dev'), + [ + 'REQUEST_URI' => 'https://roadrunner.dev', + 'REMOTE_ADDR' => '127.0.0.1', + 'REQUEST_METHOD' => 'GET', + 'HTTP_USER_AGENT' => '', + 'HTTP_HOST' => 'roadrunner.dev', + ], + ]; + + yield [ + new Request(uri: 'https://roadrunner.dev:8080'), + [ + 'REQUEST_URI' => 'https://roadrunner.dev:8080', + 'REMOTE_ADDR' => '127.0.0.1', + 'REQUEST_METHOD' => 'GET', + 'HTTP_USER_AGENT' => '', + 'HTTP_HOST' => 'roadrunner.dev:8080', + ], + ]; + } + + /** + * @param array $expected + */ + #[DataProvider('enrichServerVarsDataProvider')] + public function testEnrichServerVars(Request $request, array $expected): void + { + $_SERVER = []; + + $server = GlobalState::enrichServerVars($request); + + $this->assertArrayHasKey('REQUEST_TIME', $server); + $this->assertArrayHasKey('REQUEST_TIME_FLOAT', $server); + + unset($server['REQUEST_TIME']); + unset($server['REQUEST_TIME_FLOAT']); + + $this->assertEquals($server, $expected); + } +}