diff --git a/src/Http/Adapter/Swoole/Request.php b/src/Http/Adapter/Swoole/Request.php index 0ec3126..b07a5fd 100644 --- a/src/Http/Adapter/Swoole/Request.php +++ b/src/Http/Adapter/Swoole/Request.php @@ -253,9 +253,20 @@ 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); + $cookieValue = \trim($cookieValue); + if ($cookieKey === $key) { + return $cookieValue; + } + } - return $this->swoole->cookie[$key] ?? $default; + return $default; } /** @@ -361,17 +372,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..7279ee4 100644 --- a/tests/e2e/BaseTest.php +++ b/tests/e2e/BaseTest.php @@ -38,11 +38,34 @@ public function testFile() public function testCookie() { - $response = $this->client->call(Client::METHOD_GET, '/cookies', [ - 'Cookie: cookie1=value1; cookie2=value2' - ]); + // 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('cookie1=value1; cookie2=value2', $response['body']); + $this->assertEquals($cookie, $response['body']); } }