From 4700d389a63eabb1e2accfceaacaf89c73c66079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 2 Sep 2025 12:19:35 +0200 Subject: [PATCH 1/2] Improve cookie handling --- src/Http/Adapter/Swoole/Request.php | 29 ++++++++++++++++------------- src/Http/Adapter/Swoole/Server.php | 3 ++- tests/e2e/BaseTest.php | 19 +++++++++++++++++-- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/Http/Adapter/Swoole/Request.php b/src/Http/Adapter/Swoole/Request.php index 0ec3126..f0dd1d6 100644 --- a/src/Http/Adapter/Swoole/Request.php +++ b/src/Http/Adapter/Swoole/Request.php @@ -253,9 +253,21 @@ public function getFiles($key): array */ public function getCookie(string $key, string $default = ''): string { - $key = strtolower($key); + $key = \strtolower($key); + + $cookies = \explode(';', $this->getHeader('cookie', '')); + foreach ($cookies as $cookie) { + $cookie = \trim($cookie); + [$cookieKey, $cookieValue] = \explode('=', $cookie, 2); + $cookieKey = \trim($cookieKey); + $cookieKey = \strtolower($cookieKey); + $cookieValue = \trim($cookieValue); + if ($cookieValue === $key) { + return $cookieValue; + } + } - return $this->swoole->cookie[$key] ?? $default; + return $default; } /** @@ -361,17 +373,8 @@ protected function generateHeaders(): array { $headers = $this->swoole->header; - if (empty($this->swoole->cookie)) { - return $headers; - } - - $cookieHeaders = []; - foreach ($this->swoole->cookie as $key => $value) { - $cookieHeaders[] = "{$key}={$value}"; - } - - if (!empty($cookieHeaders)) { - $headers['cookie'] = \implode('; ', $cookieHeaders); + foreach ($headers as $key => $value) { + $headers[strtolower($key)] = $value; } return $headers; diff --git a/src/Http/Adapter/Swoole/Server.php b/src/Http/Adapter/Swoole/Server.php index fff99f1..bb3b87d 100755 --- a/src/Http/Adapter/Swoole/Server.php +++ b/src/Http/Adapter/Swoole/Server.php @@ -19,7 +19,8 @@ public function __construct(string $host, ?string $port = null, array $settings { $this->server = new SwooleServer($host, $port); $this->server->set(\array_merge($settings, [ - 'enable_coroutine' => true + 'enable_coroutine' => true, + 'http_parse_cookie' => false, ])); } diff --git a/tests/e2e/BaseTest.php b/tests/e2e/BaseTest.php index 57d04aa..f95e96c 100644 --- a/tests/e2e/BaseTest.php +++ b/tests/e2e/BaseTest.php @@ -38,11 +38,26 @@ public function testFile() public function testCookie() { + $cookie = 'cookie1=value1'; $response = $this->client->call(Client::METHOD_GET, '/cookies', [ - 'Cookie: cookie1=value1; cookie2=value2' + 'Cookie: ' . $cookie ]); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals($cookie, $response['body']); + + $cookie = 'cookie1=value1; cookie2=value2'; + $response = $this->client->call(Client::METHOD_GET, '/cookies', [ + 'Cookie: ' . $cookie + ]); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals($cookie, $response['body']); + + $cookie = 'cookie1=value1;cookie2=value2'; + $response = $this->client->call(Client::METHOD_GET, '/cookies', [ + 'Cookie: ' . $cookie + ]); $this->assertEquals(200, $response['headers']['status-code']); - $this->assertEquals('cookie1=value1; cookie2=value2', $response['body']); + $this->assertEquals($cookie, $response['body']); } } From abe33048a19edde616c444d3d6f0d425c7eb0555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 2 Sep 2025 13:16:19 +0200 Subject: [PATCH 2/2] Logical fixes & new tests --- src/Http/Adapter/Swoole/Request.php | 3 +-- tests/e2e/BaseTest.php | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/Http/Adapter/Swoole/Request.php b/src/Http/Adapter/Swoole/Request.php index f0dd1d6..b07a5fd 100644 --- a/src/Http/Adapter/Swoole/Request.php +++ b/src/Http/Adapter/Swoole/Request.php @@ -260,9 +260,8 @@ public function getCookie(string $key, string $default = ''): string $cookie = \trim($cookie); [$cookieKey, $cookieValue] = \explode('=', $cookie, 2); $cookieKey = \trim($cookieKey); - $cookieKey = \strtolower($cookieKey); $cookieValue = \trim($cookieValue); - if ($cookieValue === $key) { + if ($cookieKey === $key) { return $cookieValue; } } diff --git a/tests/e2e/BaseTest.php b/tests/e2e/BaseTest.php index f95e96c..7279ee4 100644 --- a/tests/e2e/BaseTest.php +++ b/tests/e2e/BaseTest.php @@ -38,25 +38,33 @@ public function testFile() public function testCookie() { + // One cookie $cookie = 'cookie1=value1'; - $response = $this->client->call(Client::METHOD_GET, '/cookies', [ - 'Cookie: ' . $cookie - ]); + $response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals($cookie, $response['body']); + // Two cookiees $cookie = 'cookie1=value1; cookie2=value2'; - $response = $this->client->call(Client::METHOD_GET, '/cookies', [ - 'Cookie: ' . $cookie - ]); + $response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals($cookie, $response['body']); - + // Two cookies without optional space $cookie = 'cookie1=value1;cookie2=value2'; - $response = $this->client->call(Client::METHOD_GET, '/cookies', [ - 'Cookie: ' . $cookie - ]); + $response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals($cookie, $response['body']); + + // Cookie with "=" in value + $cookie = 'cookie1=value1=value2'; + $response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals($cookie, $response['body']); + + // Case sensitivity for cookie names + $cookie = 'cookie1=v1; Cookie1=v2'; + $response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals($cookie, $response['body']); }