Skip to content

Commit b4f6af0

Browse files
authored
Merge pull request #8240 from kenjis/fix-use-addHeader
fix: use `addHeader()`
2 parents 49d1ba0 + 8b0e1fe commit b4f6af0

File tree

8 files changed

+122
-20
lines changed

8 files changed

+122
-20
lines changed

app/Views/errors/html/error_exception.php

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?php
2+
use CodeIgniter\HTTP\Header;
23
use Config\Services;
34
use CodeIgniter\CodeIgniter;
45

@@ -312,10 +313,20 @@
312313
</tr>
313314
</thead>
314315
<tbody>
315-
<?php foreach ($headers as $header) : ?>
316+
<?php foreach ($headers as $name => $value) : ?>
316317
<tr>
317-
<td><?= esc($header->getName(), 'html') ?></td>
318-
<td><?= esc($header->getValueLine(), 'html') ?></td>
318+
<td><?= esc($name, 'html') ?></td>
319+
<td>
320+
<?php
321+
if ($value instanceof Header) {
322+
echo esc($value->getValueLine(), 'html');
323+
} else {
324+
foreach ($value as $i => $header) {
325+
echo ' ('. $i+1 . ') ' . esc($header->getValueLine(), 'html');
326+
}
327+
}
328+
?>
329+
</td>
319330
</tr>
320331
<?php endforeach; ?>
321332
</tbody>
@@ -339,8 +350,6 @@
339350

340351
<?php $headers = $response->headers(); ?>
341352
<?php if (! empty($headers)) : ?>
342-
<?php natsort($headers) ?>
343-
344353
<h3>Headers</h3>
345354

346355
<table>
@@ -351,10 +360,20 @@
351360
</tr>
352361
</thead>
353362
<tbody>
354-
<?php foreach (array_keys($headers) as $name) : ?>
363+
<?php foreach ($headers as $name => $value) : ?>
355364
<tr>
356365
<td><?= esc($name, 'html') ?></td>
357-
<td><?= esc($response->getHeaderLine($name), 'html') ?></td>
366+
<td>
367+
<?php
368+
if ($value instanceof Header) {
369+
echo esc($response->getHeaderLine($name), 'html');
370+
} else {
371+
foreach ($value as $i => $header) {
372+
echo ' ('. $i+1 . ') ' . esc($header->getValueLine(), 'html');
373+
}
374+
}
375+
?>
376+
</td>
358377
</tr>
359378
<?php endforeach; ?>
360379
</tbody>

deptrac.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ parameters:
225225
# Individual class exemptions
226226
CodeIgniter\Cache\ResponseCache:
227227
- CodeIgniter\HTTP\CLIRequest
228+
- CodeIgniter\HTTP\Header
228229
- CodeIgniter\HTTP\IncomingRequest
229230
- CodeIgniter\HTTP\ResponseInterface
230231
CodeIgniter\Entity\Cast\URICast:

system/Cache/ResponseCache.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace CodeIgniter\Cache;
1313

1414
use CodeIgniter\HTTP\CLIRequest;
15+
use CodeIgniter\HTTP\Header;
1516
use CodeIgniter\HTTP\IncomingRequest;
1617
use CodeIgniter\HTTP\ResponseInterface;
1718
use Config\Cache as CacheConfig;
@@ -99,8 +100,14 @@ public function make($request, ResponseInterface $response): bool
99100

100101
$headers = [];
101102

102-
foreach ($response->headers() as $header) {
103-
$headers[$header->getName()] = $header->getValueLine();
103+
foreach ($response->headers() as $name => $value) {
104+
if ($value instanceof Header) {
105+
$headers[$name] = $value->getValueLine();
106+
} else {
107+
foreach ($value as $header) {
108+
$headers[$name][] = $header->getValueLine();
109+
}
110+
}
104111
}
105112

106113
return $this->cache->save(

system/Debug/Toolbar.php

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use CodeIgniter\Format\JSONFormatter;
1919
use CodeIgniter\Format\XMLFormatter;
2020
use CodeIgniter\HTTP\DownloadResponse;
21+
use CodeIgniter\HTTP\Header;
2122
use CodeIgniter\HTTP\IncomingRequest;
2223
use CodeIgniter\HTTP\RequestInterface;
2324
use CodeIgniter\HTTP\ResponseInterface;
@@ -140,8 +141,17 @@ public function run(float $startTime, float $totalTime, RequestInterface $reques
140141
$data['vars']['post'][esc($name)] = is_array($value) ? '<pre>' . esc(print_r($value, true)) . '</pre>' : esc($value);
141142
}
142143

143-
foreach ($request->headers() as $header) {
144-
$data['vars']['headers'][esc($header->getName())] = esc($header->getValueLine());
144+
foreach ($request->headers() as $name => $value) {
145+
if ($value instanceof Header) {
146+
$data['vars']['headers'][esc($name)] = esc($value->getValueLine());
147+
} else {
148+
foreach ($value as $i => $header) {
149+
$index = $i + 1;
150+
$data['vars']['headers'][esc($name)] ??= '';
151+
$data['vars']['headers'][esc($name)] .= ' (' . $index . ') '
152+
. esc($header->getValueLine());
153+
}
154+
}
145155
}
146156

147157
foreach ($request->getCookie() as $name => $value) {
@@ -157,8 +167,17 @@ public function run(float $startTime, float $totalTime, RequestInterface $reques
157167
'headers' => [],
158168
];
159169

160-
foreach ($response->headers() as $header) {
161-
$data['vars']['response']['headers'][esc($header->getName())] = esc($header->getValueLine());
170+
foreach ($response->headers() as $name => $value) {
171+
if ($value instanceof Header) {
172+
$data['vars']['response']['headers'][esc($name)] = esc($value->getValueLine());
173+
} else {
174+
foreach ($value as $i => $header) {
175+
$index = $i + 1;
176+
$data['vars']['response']['headers'][esc($name)] ??= '';
177+
$data['vars']['response']['headers'][esc($name)] .= ' (' . $index . ') '
178+
. esc($header->getValueLine());
179+
}
180+
}
162181
}
163182

164183
$data['config'] = Config::display();

system/HTTP/CURLRequest.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -479,10 +479,14 @@ protected function setResponseHeaders(array $headers = [])
479479
{
480480
foreach ($headers as $header) {
481481
if (($pos = strpos($header, ':')) !== false) {
482-
$title = substr($header, 0, $pos);
483-
$value = substr($header, $pos + 1);
482+
$title = trim(substr($header, 0, $pos));
483+
$value = trim(substr($header, $pos + 1));
484484

485-
$this->response->setHeader($title, $value);
485+
if ($this->response instanceof Response) {
486+
$this->response->addHeader($title, $value);
487+
} else {
488+
$this->response->setHeader($title, $value);
489+
}
486490
} elseif (strpos($header, 'HTTP') === 0) {
487491
preg_match('#^HTTP\/([12](?:\.[01])?) (\d+) (.+)#', $header, $matches);
488492

system/HTTP/RedirectResponse.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,14 @@ public function withCookies()
161161
*/
162162
public function withHeaders()
163163
{
164-
foreach (Services::response()->headers() as $name => $header) {
165-
$this->setHeader($name, $header->getValue());
164+
foreach (Services::response()->headers() as $name => $value) {
165+
if ($value instanceof Header) {
166+
$this->setHeader($name, $value->getValue());
167+
} else {
168+
foreach ($value as $header) {
169+
$this->addHeader($name, $header->getValue());
170+
}
171+
}
166172
}
167173

168174
return $this;

system/HTTP/ResponseTrait.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,22 @@ public function sendHeaders()
398398
header(sprintf('HTTP/%s %s %s', $this->getProtocolVersion(), $this->getStatusCode(), $this->getReasonPhrase()), true, $this->getStatusCode());
399399

400400
// Send all of our headers
401-
foreach (array_keys($this->headers()) as $name) {
402-
header($name . ': ' . $this->getHeaderLine($name), false, $this->getStatusCode());
401+
foreach ($this->headers() as $name => $value) {
402+
if ($value instanceof Header) {
403+
header(
404+
$name . ': ' . $value->getValueLine(),
405+
false,
406+
$this->getStatusCode()
407+
);
408+
} else {
409+
foreach ($value as $header) {
410+
header(
411+
$name . ': ' . $header->getValueLine(),
412+
false,
413+
$this->getStatusCode()
414+
);
415+
}
416+
}
403417
}
404418

405419
return $this;

tests/system/HTTP/CURLRequestDoNotShareOptionsTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,38 @@ public function testResponseHeadersWithMultipleRequests(): void
852852
$this->assertSame(200, $response->getStatusCode());
853853
}
854854

855+
public function testResponseHeadersWithMultipleSetCookies(): void
856+
{
857+
$request = $this->getRequest([
858+
'base_uri' => 'https://github.com/',
859+
]);
860+
861+
$output = "HTTP/2 200
862+
server: GitHub.com
863+
date: Sat, 11 Nov 2023 02:26:55 GMT
864+
content-type: text/html; charset=utf-8
865+
set-cookie: _gh_sess=PlRlha1YumlLhLuo5MuNbIWJRO9RRuR%2FHfYsWRh5B0mkalFIZstlAbTmSstl8q%2FAC57IsWMVuFHWQc6L4qDHQJrwhuYVO5ZaigPCUjAStnhh%2FieZQVqIf92Al7vusuzx2o8XH%2Fv6nd9qzMTAWc2%2FkRsl8jxPQYGNaWeuUBY2w3%2FDORSikN4c0vHOyedhU7Xcv3Ryz5xD3DNxK9R8xKNZ6OSXLJ6bjX8iIT6LxvroVIf2HjvowW9cQsq0kN08mS6KtTnH0mD3ANWqsVVWeMzFNA%3D%3D--Jx830Q9Nmkfz9OGA--kEcPtNphvjNMopYqFDxUbw%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
866+
set-cookie: _octo=GH1.1.599292127.1699669625; Path=/; Domain=github.com; Expires=Mon, 11 Nov 2024 02:27:05 GMT; Secure; SameSite=Lax
867+
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Mon, 11 Nov 2024 02:27:05 GMT; HttpOnly; Secure; SameSite=Lax
868+
accept-ranges: bytes\x0d\x0a\x0d\x0a";
869+
$request->setOutput($output);
870+
871+
$response = $request->get('/');
872+
873+
$setCookieHeaders = $response->header('set-cookie');
874+
875+
$this->assertCount(3, $setCookieHeaders);
876+
$this->assertSame(
877+
'logged_in=no; Path=/; Domain=github.com; Expires=Mon, 11 Nov 2024 02:27:05 GMT; HttpOnly; Secure; SameSite=Lax',
878+
$setCookieHeaders[2]->getValue()
879+
);
880+
881+
$this->assertSame(
882+
'_octo=GH1.1.599292127.1699669625; Path=/; Domain=github.com; Expires=Mon, 11 Nov 2024 02:27:05 GMT; Secure; SameSite=Lax',
883+
$setCookieHeaders[1]->getValueLine()
884+
);
885+
}
886+
855887
public function testSplitResponse(): void
856888
{
857889
$request = $this->getRequest([

0 commit comments

Comments
 (0)