Skip to content

Commit 190d2d2

Browse files
committed
Fix header override
1 parent 70ecf88 commit 190d2d2

3 files changed

Lines changed: 30 additions & 10 deletions

File tree

src/Response.php

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -540,9 +540,15 @@ public function enablePayload(): static
540540
*
541541
* @param string $key
542542
* @param string $value
543+
* @param bool $override
543544
*/
544-
public function addHeader(string $key, string $value): static
545+
public function addHeader(string $key, string $value, bool $override = false): static
545546
{
547+
if ($override) {
548+
$this->headers[$key] = $value;
549+
return $this;
550+
}
551+
546552
if (\array_key_exists($key, $this->headers)) {
547553
if (\is_array($this->headers[$key])) {
548554
$this->headers[$key][] = $value;
@@ -659,7 +665,7 @@ public function send(string $body = ''): void
659665
}
660666

661667
$serverHeader = $this->headers['Server'] ?? 'Utopia/Http';
662-
$this->addHeader('Server', $serverHeader);
668+
$this->addHeader('Server', $serverHeader, override: true);
663669

664670
$this->appendCookies();
665671

@@ -674,14 +680,14 @@ public function send(string $body = ''): void
674680

675681
if ($algorithm) {
676682
$body = $algorithm->compress($body);
677-
$this->addHeader('Content-Length', (string) \strlen($body));
678-
$this->addHeader('Content-Encoding', $algorithm->getContentEncoding());
679-
$this->addHeader('X-Utopia-Compression', 'true');
680-
$this->addHeader('Vary', 'Accept-Encoding');
683+
$this->addHeader('Content-Length', (string) \strlen($body), override: true);
684+
$this->addHeader('Content-Encoding', $algorithm->getContentEncoding(), override: true);
685+
$this->addHeader('X-Utopia-Compression', 'true', override: true);
686+
$this->addHeader('Vary', 'Accept-Encoding', override: true);
681687
}
682688
}
683689

684-
$this->addHeader('X-Debug-Speed', (string) (microtime(true) - $this->startTime));
690+
$this->addHeader('X-Debug-Speed', (string) (microtime(true) - $this->startTime), override: true);
685691
$this->appendHeaders();
686692

687693
// Send response
@@ -769,7 +775,7 @@ public function chunk(string $body = '', bool $end = false): void
769775
$this->sent = true;
770776
}
771777

772-
$this->addHeader('X-Debug-Speed', (string) (microtime(true) - $this->startTime));
778+
$this->addHeader('X-Debug-Speed', (string) (microtime(true) - $this->startTime), override: true);
773779

774780
$this
775781
->appendCookies()
@@ -799,7 +805,7 @@ protected function appendHeaders(): static
799805

800806
// Send content type header
801807
if (!empty($this->contentType)) {
802-
$this->addHeader('Content-Type', $this->contentType);
808+
$this->addHeader('Content-Type', $this->contentType, override: true);
803809
}
804810

805811
// Set application headers
@@ -908,7 +914,7 @@ public function redirect(string $url, int $statusCode = 301): void
908914
}
909915

910916
$this
911-
->addHeader('Location', $url)
917+
->addHeader('Location', $url, override: true)
912918
->setStatusCode($statusCode)
913919
->send('');
914920
}

tests/e2e/ResponseTest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,5 +162,10 @@ public function testSetCookie()
162162
$this->assertEquals(200, $response['headers']['status-code']);
163163
$this->assertEquals('value1', $response['cookies']['key1']);
164164
$this->assertEquals('value2', $response['cookies']['key2']);
165+
166+
$response = $this->client->call(Client::METHOD_GET, '/set-cookie-override');
167+
$this->assertEquals(200, $response['headers']['status-code']);
168+
$this->assertArrayNotHasKey('key1', $response['cookies']);
169+
$this->assertEquals('value2', $response['cookies']['key2']);
165170
}
166171
}

tests/e2e/server.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@
4242
$response->send('OK');
4343
});
4444

45+
App::get('/set-cookie-override')
46+
->inject('request')
47+
->inject('response')
48+
->action(function (Request $request, Response $response) {
49+
$response->addHeader('Set-Cookie', 'key1=value1', override: true);
50+
$response->addHeader('Set-Cookie', 'key2=value2', override: true);
51+
$response->send('OK');
52+
});
53+
4554
App::get('/chunked')
4655
->inject('response')
4756
->action(function (Response $response) {

0 commit comments

Comments
 (0)