From e047a1febf8d0de909c70fa8b90fa55355a96420 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Wed, 8 Apr 2026 15:45:11 +0530 Subject: [PATCH 1/3] Use Swoole parsed cookies again --- src/Http/Adapter/Swoole/Request.php | 26 ++------------ src/Http/Adapter/Swoole/Server.php | 4 +-- src/Http/Adapter/SwooleCoroutine/Server.php | 4 +-- tests/SwooleRequestTest.php | 40 +++++++++++++++++++++ tests/e2e/BaseTest.php | 33 ----------------- tests/e2e/ResponseFPMTest.php | 28 +++++++++++++++ tests/e2e/ResponseSwooleTest.php | 13 +++++++ tests/e2e/init.php | 8 +++++ 8 files changed, 94 insertions(+), 62 deletions(-) create mode 100644 tests/SwooleRequestTest.php diff --git a/src/Http/Adapter/Swoole/Request.php b/src/Http/Adapter/Swoole/Request.php index 41ac541d..92b7360b 100644 --- a/src/Http/Adapter/Swoole/Request.php +++ b/src/Http/Adapter/Swoole/Request.php @@ -271,23 +271,9 @@ public function getFiles($key): array */ public function getCookie(string $key, string $default = ''): string { - $key = \strtolower($key); - - $cookies = \explode(';', $this->getHeader('cookie', '')); - foreach ($cookies as $cookie) { - $cookie = \trim($cookie); - if ($cookie === '') { - continue; - } - $parts = \explode('=', $cookie, 2); - $cookieKey = \trim($parts[0]); - $cookieValue = isset($parts[1]) ? \trim($parts[1]) : ''; - if ($cookieKey === $key) { - return $cookieValue; - } - } + $key = strtolower($key); - return $default; + return $this->swoole->cookie[$key] ?? $default; } /** @@ -391,12 +377,6 @@ protected function generateInput(): array */ protected function generateHeaders(): array { - $headers = $this->swoole->header; - - foreach ($headers as $key => $value) { - $headers[strtolower($key)] = $value; - } - - return $headers; + return $this->swoole->header; } } diff --git a/src/Http/Adapter/Swoole/Server.php b/src/Http/Adapter/Swoole/Server.php index 14d93bb8..8ba2adbe 100755 --- a/src/Http/Adapter/Swoole/Server.php +++ b/src/Http/Adapter/Swoole/Server.php @@ -18,9 +18,7 @@ class Server extends Adapter public function __construct(string $host, ?string $port = null, array $settings = [], int $mode = SWOOLE_PROCESS, ?Container $container = null) { $this->server = new SwooleServer($host, (int) $port, $mode); - $this->server->set(\array_merge($settings, [ - 'http_parse_cookie' => false, - ])); + $this->server->set($settings); $this->container = $container ?? new Container(); } diff --git a/src/Http/Adapter/SwooleCoroutine/Server.php b/src/Http/Adapter/SwooleCoroutine/Server.php index 456e3a84..52b14116 100644 --- a/src/Http/Adapter/SwooleCoroutine/Server.php +++ b/src/Http/Adapter/SwooleCoroutine/Server.php @@ -26,9 +26,7 @@ public function __construct( ?Container $container = null ) { $this->server = new SwooleServer($host, $port, false, true); - $this->server->set(\array_merge($settings, [ - 'http_parse_cookie' => false, - ])); + $this->server->set($settings); $this->container = $container ?? new Container(); } diff --git a/tests/SwooleRequestTest.php b/tests/SwooleRequestTest.php new file mode 100644 index 00000000..a1b644b9 --- /dev/null +++ b/tests/SwooleRequestTest.php @@ -0,0 +1,40 @@ +cookie = [ + 'cookie1' => 'value1', + 'cookie2' => 'value2', + ]; + + $request = new Request($swooleRequest); + + $this->assertSame('value1', $request->getCookie('cookie1', '')); + $this->assertSame('value2', $request->getCookie('cookie2', '')); + $this->assertSame('fallback', $request->getCookie('missing', 'fallback')); + } + + public function testGetHeadersDoesNotSynthesizeCookieHeader(): void + { + $swooleRequest = new SwooleRequest(); + $swooleRequest->header = [ + 'host' => 'localhost', + ]; + $swooleRequest->cookie = [ + 'cookie1' => 'value1', + ]; + + $request = new Request($swooleRequest); + + $this->assertSame(['host' => 'localhost'], $request->getHeaders()); + } +} diff --git a/tests/e2e/BaseTest.php b/tests/e2e/BaseTest.php index 04b4249d..9a9d453d 100644 --- a/tests/e2e/BaseTest.php +++ b/tests/e2e/BaseTest.php @@ -36,39 +36,6 @@ public function testFile() $this->assertEquals(204, $response['headers']['status-code']); } - public function testCookie() - { - // One cookie - $cookie = 'cookie1=value1'; - $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 ]); - $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 ]); - $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']); - } - public function testSetCookie() { $response = $this->client->call(Client::METHOD_GET, '/set-cookie'); diff --git a/tests/e2e/ResponseFPMTest.php b/tests/e2e/ResponseFPMTest.php index 8a3cb4ff..cd04bcd1 100644 --- a/tests/e2e/ResponseFPMTest.php +++ b/tests/e2e/ResponseFPMTest.php @@ -14,4 +14,32 @@ public function setUp(): void { $this->client = new Client(); } + + public function testCookie(): void + { + $cookie = 'cookie1=value1'; + $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($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=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=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']); + } } diff --git a/tests/e2e/ResponseSwooleTest.php b/tests/e2e/ResponseSwooleTest.php index 0851554a..284084cb 100755 --- a/tests/e2e/ResponseSwooleTest.php +++ b/tests/e2e/ResponseSwooleTest.php @@ -15,6 +15,19 @@ public function setUp(): void $this->client = new Client('http://swoole'); } + public function testCookie(): void + { + $headers = ['Cookie: cookie1=value1; cookie2=value2']; + + $response = $this->client->call(Client::METHOD_GET, '/cookie/cookie1', $headers); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('value1', $response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/cookie/cookie2', $headers); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('value2', $response['body']); + } + public function testSwooleResources(): void { $response = $this->client->call(Client::METHOD_DELETE, '/swoole-test'); diff --git a/tests/e2e/init.php b/tests/e2e/init.php index fb0d9d59..e521265c 100644 --- a/tests/e2e/init.php +++ b/tests/e2e/init.php @@ -34,6 +34,14 @@ $response->send($request->getHeaders()['cookie'] ?? ''); }); +Http::get('/cookie/:key') + ->param('key', '', new Text(64)) + ->inject('request') + ->inject('response') + ->action(function (string $key, Request $request, Response $response) { + $response->send($request->getCookie($key, '')); + }); + Http::get('/set-cookie') ->inject('request') ->inject('response') From ab3da3fd6067cafc45fa1d20e5cae1a612fb2f88 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Wed, 8 Apr 2026 15:48:16 +0530 Subject: [PATCH 2/3] Skip Swoole test without extension --- tests/SwooleRequestTest.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/SwooleRequestTest.php b/tests/SwooleRequestTest.php index a1b644b9..59a48305 100644 --- a/tests/SwooleRequestTest.php +++ b/tests/SwooleRequestTest.php @@ -8,9 +8,18 @@ class SwooleRequestTest extends TestCase { + private function createSwooleRequest(): SwooleRequest + { + if (!\class_exists(SwooleRequest::class)) { + $this->markTestSkipped('Swoole extension is not available.'); + } + + return new SwooleRequest(); + } + public function testCanGetCookieFromParsedSwooleCookies(): void { - $swooleRequest = new SwooleRequest(); + $swooleRequest = $this->createSwooleRequest(); $swooleRequest->cookie = [ 'cookie1' => 'value1', 'cookie2' => 'value2', @@ -25,7 +34,7 @@ public function testCanGetCookieFromParsedSwooleCookies(): void public function testGetHeadersDoesNotSynthesizeCookieHeader(): void { - $swooleRequest = new SwooleRequest(); + $swooleRequest = $this->createSwooleRequest(); $swooleRequest->header = [ 'host' => 'localhost', ]; From af2b4a93ea16387b3f77c8ad1a31c9e9ae5f6c0b Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Wed, 8 Apr 2026 15:52:10 +0530 Subject: [PATCH 3/3] Remove Swoole adapter unit test --- tests/SwooleRequestTest.php | 49 ------------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 tests/SwooleRequestTest.php diff --git a/tests/SwooleRequestTest.php b/tests/SwooleRequestTest.php deleted file mode 100644 index 59a48305..00000000 --- a/tests/SwooleRequestTest.php +++ /dev/null @@ -1,49 +0,0 @@ -markTestSkipped('Swoole extension is not available.'); - } - - return new SwooleRequest(); - } - - public function testCanGetCookieFromParsedSwooleCookies(): void - { - $swooleRequest = $this->createSwooleRequest(); - $swooleRequest->cookie = [ - 'cookie1' => 'value1', - 'cookie2' => 'value2', - ]; - - $request = new Request($swooleRequest); - - $this->assertSame('value1', $request->getCookie('cookie1', '')); - $this->assertSame('value2', $request->getCookie('cookie2', '')); - $this->assertSame('fallback', $request->getCookie('missing', 'fallback')); - } - - public function testGetHeadersDoesNotSynthesizeCookieHeader(): void - { - $swooleRequest = $this->createSwooleRequest(); - $swooleRequest->header = [ - 'host' => 'localhost', - ]; - $swooleRequest->cookie = [ - 'cookie1' => 'value1', - ]; - - $request = new Request($swooleRequest); - - $this->assertSame(['host' => 'localhost'], $request->getHeaders()); - } -}