Skip to content

Commit 0c62db7

Browse files
committed
Fix fpm cookie tests
1 parent 3ee6a78 commit 0c62db7

3 files changed

Lines changed: 58 additions & 4 deletions

File tree

src/Http/Adapter/Swoole/Request.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,19 @@ protected function generateInput(): array
392392
*/
393393
protected function generateHeaders(): array
394394
{
395-
$headers = $this->swoole->header;
395+
$headers = $this->swoole->header ?? [];
396+
397+
// Check if cookies are available in a separate property
398+
if (!empty($this->swoole->cookie)) {
399+
// Convert cookies back to Cookie header format
400+
$cookiePairs = [];
401+
foreach ($this->swoole->cookie as $name => $value) {
402+
$cookiePairs[] = $name . '=' . $value;
403+
}
404+
if (!empty($cookiePairs)) {
405+
$headers['cookie'] = implode('; ', $cookiePairs);
406+
}
407+
}
396408

397409
foreach ($headers as $key => $value) {
398410
$headers[strtolower($key)] = $value;

tests/e2e/BaseTest.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,16 @@ public function testCookie()
9595
$this->assertEquals(200, $response['headers']['status-code']);
9696
$this->assertEquals($cookie, $response['body']);
9797

98+
/**
99+
* Cookie response always expecting space in multiple cookie
100+
* as RFC 6265 (https://datatracker.ietf.org/doc/html/rfc6265#section-4.2.1) recommends it
101+
*/
102+
98103
// Two cookies without optional space
99104
$cookie = 'cookie1=value1;cookie2=value2';
100105
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie' => $cookie ]);
101106
$this->assertEquals(200, $response['headers']['status-code']);
102-
$this->assertEquals($cookie, $response['body']);
107+
$this->assertEquals('cookie1=value1; cookie2=value2', $response['body']);
103108

104109
// Cookie with "=" in value
105110
$cookie = 'cookie1=value1=value2';
@@ -108,10 +113,10 @@ public function testCookie()
108113
$this->assertEquals($cookie, $response['body']);
109114

110115
// Case sensitivity for cookie names
111-
$cookie = 'cookie1=v1; Cookie1=v2';
116+
$cookie = 'cookie1=v1;Cookie1=v2';
112117
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie' => $cookie ]);
113118
$this->assertEquals(200, $response['headers']['status-code']);
114-
$this->assertEquals($cookie, $response['body']);
119+
$this->assertEquals('cookie1=v1; Cookie1=v2', $response['body']);
115120
}
116121

117122
public function testSetCookie()

tests/e2e/ResponseFPMTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,41 @@ public function setUp(): void
1414
{
1515
$this->client = new Client('http://fpm');
1616
}
17+
18+
/**
19+
* Override cookie test for FPM specific behavior
20+
* FPM preserves original cookie format while Swoole normalizes it
21+
*/
22+
public function testCookie()
23+
{
24+
// One cookie
25+
$cookie = 'cookie1=value1';
26+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie' => $cookie ]);
27+
$this->assertEquals(200, $response['headers']['status-code']);
28+
$this->assertEquals($cookie, $response['body']);
29+
30+
// Two cookies with space (FPM preserves original format)
31+
$cookie = 'cookie1=value1; cookie2=value2';
32+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie' => $cookie ]);
33+
$this->assertEquals(200, $response['headers']['status-code']);
34+
$this->assertEquals($cookie, $response['body']);
35+
36+
// Two cookies without space (FPM preserves original format)
37+
$cookie = 'cookie1=value1;cookie2=value2';
38+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie' => $cookie ]);
39+
$this->assertEquals(200, $response['headers']['status-code']);
40+
$this->assertEquals($cookie, $response['body']);
41+
42+
// Cookie with "=" in value
43+
$cookie = 'cookie1=value1=value2';
44+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie' => $cookie ]);
45+
$this->assertEquals(200, $response['headers']['status-code']);
46+
$this->assertEquals($cookie, $response['body']);
47+
48+
// Case sensitivity for cookie names
49+
$cookie = 'cookie1=v1; Cookie1=v2';
50+
$response = $this->client->call(Client::METHOD_GET, '/cookies', [ 'Cookie' => $cookie ]);
51+
$this->assertEquals(200, $response['headers']['status-code']);
52+
$this->assertEquals($cookie, $response['body']);
53+
}
1754
}

0 commit comments

Comments
 (0)