Skip to content

Commit 624a83c

Browse files
committed
Allow http_response_code() to clear HTTP start-line
Fixes GH-18582 Fixes #81451
1 parent e0ab056 commit 624a83c

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

ext/standard/head.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,12 @@ PHP_FUNCTION(http_response_code)
375375
}
376376
RETURN_FALSE;
377377
}
378+
379+
if (SG(sapi_headers).http_status_line) {
380+
efree(SG(sapi_headers).http_status_line);
381+
SG(sapi_headers).http_status_line = NULL;
382+
}
383+
378384
zend_long old_response_code;
379385

380386
old_response_code = SG(sapi_headers).http_response_code;

sapi/cli/tests/gh18582.phpt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
--TEST--
2+
GH-18582: Allow http_response_code() to clear HTTP start-line
3+
--SKIPIF--
4+
<?php
5+
include "skipif.inc";
6+
?>
7+
--FILE--
8+
<?php
9+
include "php_cli_server.inc";
10+
11+
php_cli_server_start(<<<'PHP'
12+
http_response_code(401);
13+
header('HTTP/1.1 404 Not Found');
14+
$is_404 = http_response_code(403);
15+
$should_be_404_but_is_403 = http_response_code();
16+
echo $is_404 . PHP_EOL;
17+
echo $should_be_404_but_is_403 . PHP_EOL;
18+
PHP);
19+
20+
$host = PHP_CLI_SERVER_HOSTNAME;
21+
$fp = php_cli_server_connect();
22+
if (fwrite($fp, "GET / HTTP/1.1\nHost: {$host}\n\n")) {
23+
while (!feof($fp)) {
24+
echo fgets($fp);
25+
}
26+
}
27+
fclose($fp);
28+
?>
29+
--EXPECTF--
30+
HTTP/1.1 403 Forbidden
31+
Host: %s
32+
Date: %s
33+
Connection: close
34+
X-Powered-By: %s
35+
Content-type: text/html; charset=UTF-8
36+
37+
404
38+
403

0 commit comments

Comments
 (0)