Skip to content

Commit fc15db4

Browse files
committed
Warn on http_response_code() after header('HTTP/...')
Fixes GH-18582 Fixes #81451
1 parent 5a06842 commit fc15db4

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

ext/standard/head.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,11 @@ PHP_FUNCTION(http_response_code)
375375
}
376376
RETURN_FALSE;
377377
}
378+
379+
if (SG(sapi_headers).http_status_line) {
380+
php_error_docref(NULL, E_WARNING, "Calling http_response_code() after header('HTTP/...') has no effect. This will change in PHP 9.0");
381+
}
382+
378383
zend_long old_response_code;
379384

380385
old_response_code = SG(sapi_headers).http_response_code;

sapi/cli/tests/gh18582.phpt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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 404 Not Found
31+
Host: %s
32+
Date: %s
33+
Connection: close
34+
X-Powered-By: %s
35+
Content-type: text/html; charset=UTF-8
36+
37+
<br />
38+
<b>Warning</b>: http_response_code(): Calling http_response_code() after header('HTTP/...') has no effect. This will change in PHP 9.0 in <b>%s</b> on line <b>3</b><br />
39+
404
40+
403

0 commit comments

Comments
 (0)