Skip to content

Commit be935b1

Browse files
authored
Merge pull request #180 from utopia-php/feat-improve-cookie-handling
Feat: Improve cookie handling
2 parents 9e8cd49 + abe3304 commit be935b1

3 files changed

Lines changed: 44 additions & 18 deletions

File tree

src/Http/Adapter/Swoole/Request.php

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,20 @@ public function getFiles($key): array
253253
*/
254254
public function getCookie(string $key, string $default = ''): string
255255
{
256-
$key = strtolower($key);
256+
$key = \strtolower($key);
257+
258+
$cookies = \explode(';', $this->getHeader('cookie', ''));
259+
foreach ($cookies as $cookie) {
260+
$cookie = \trim($cookie);
261+
[$cookieKey, $cookieValue] = \explode('=', $cookie, 2);
262+
$cookieKey = \trim($cookieKey);
263+
$cookieValue = \trim($cookieValue);
264+
if ($cookieKey === $key) {
265+
return $cookieValue;
266+
}
267+
}
257268

258-
return $this->swoole->cookie[$key] ?? $default;
269+
return $default;
259270
}
260271

261272
/**
@@ -361,17 +372,8 @@ protected function generateHeaders(): array
361372
{
362373
$headers = $this->swoole->header;
363374

364-
if (empty($this->swoole->cookie)) {
365-
return $headers;
366-
}
367-
368-
$cookieHeaders = [];
369-
foreach ($this->swoole->cookie as $key => $value) {
370-
$cookieHeaders[] = "{$key}={$value}";
371-
}
372-
373-
if (!empty($cookieHeaders)) {
374-
$headers['cookie'] = \implode('; ', $cookieHeaders);
375+
foreach ($headers as $key => $value) {
376+
$headers[strtolower($key)] = $value;
375377
}
376378

377379
return $headers;

src/Http/Adapter/Swoole/Server.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ public function __construct(string $host, ?string $port = null, array $settings
1919
{
2020
$this->server = new SwooleServer($host, $port);
2121
$this->server->set(\array_merge($settings, [
22-
'enable_coroutine' => true
22+
'enable_coroutine' => true,
23+
'http_parse_cookie' => false,
2324
]));
2425
}
2526

tests/e2e/BaseTest.php

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,34 @@ public function testFile()
3838

3939
public function testCookie()
4040
{
41-
$response = $this->client->call(Client::METHOD_GET, '/cookies', [
42-
'Cookie: cookie1=value1; cookie2=value2'
43-
]);
41+
// One cookie
42+
$cookie = 'cookie1=value1';
43+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]);
44+
$this->assertEquals(200, $response['headers']['status-code']);
45+
$this->assertEquals($cookie, $response['body']);
46+
47+
// Two cookiees
48+
$cookie = 'cookie1=value1; cookie2=value2';
49+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]);
50+
$this->assertEquals(200, $response['headers']['status-code']);
51+
$this->assertEquals($cookie, $response['body']);
52+
53+
// Two cookies without optional space
54+
$cookie = 'cookie1=value1;cookie2=value2';
55+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]);
56+
$this->assertEquals(200, $response['headers']['status-code']);
57+
$this->assertEquals($cookie, $response['body']);
58+
59+
// Cookie with "=" in value
60+
$cookie = 'cookie1=value1=value2';
61+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]);
62+
$this->assertEquals(200, $response['headers']['status-code']);
63+
$this->assertEquals($cookie, $response['body']);
4464

65+
// Case sensitivity for cookie names
66+
$cookie = 'cookie1=v1; Cookie1=v2';
67+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie: ' . $cookie ]);
4568
$this->assertEquals(200, $response['headers']['status-code']);
46-
$this->assertEquals('cookie1=value1; cookie2=value2', $response['body']);
69+
$this->assertEquals($cookie, $response['body']);
4770
}
4871
}

0 commit comments

Comments
 (0)