Skip to content

Commit a184594

Browse files
committed
Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1: php_cli_server: ensure single date header is present
2 parents af5cdd8 + f6ac08c commit a184594

File tree

3 files changed

+62
-5
lines changed

3 files changed

+62
-5
lines changed

NEWS

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ PHP NEWS
1010
. Fixed bug GH-12273 (__builtin_cpu_init check). (Freaky)
1111
. Fixed bug #80092 (ZTS + preload = segfault on shutdown). (nielsdos)
1212

13+
- CLI:
14+
. Ensure a single Date header is present. (coppolafab)
15+
1316
- CType:
1417
. Fixed bug GH-11997 (ctype_alnum 5 times slower in PHP 8.1 or greater).
1518
(nielsdos)

sapi/cli/php_cli_server.c

+20-5
Original file line numberDiff line numberDiff line change
@@ -347,18 +347,33 @@ static void append_http_status_line(smart_str *buffer, int protocol_version, int
347347
smart_str_appendl_ex(buffer, "\r\n", 2, persistent);
348348
} /* }}} */
349349

350-
static void append_essential_headers(smart_str* buffer, php_cli_server_client *client, bool persistent) /* {{{ */
350+
static void append_essential_headers(smart_str* buffer, php_cli_server_client *client, bool persistent, sapi_headers_struct *sapi_headers) /* {{{ */
351351
{
352352
zval *val;
353353
struct timeval tv = {0};
354+
bool append_date_header = true;
355+
356+
if (sapi_headers != NULL) {
357+
zend_llist_position pos;
358+
sapi_header_struct *h = (sapi_header_struct*)zend_llist_get_first_ex(&sapi_headers->headers, &pos);
359+
while (h) {
360+
if (h->header_len > strlen("Date:")) {
361+
if (strncasecmp(h->header, "Date:", strlen("Date:")) == 0) {
362+
append_date_header = false;
363+
break;
364+
}
365+
}
366+
h = (sapi_header_struct*)zend_llist_get_next_ex(&sapi_headers->headers, &pos);
367+
}
368+
}
354369

355370
if (NULL != (val = zend_hash_str_find(&client->request.headers, "host", sizeof("host")-1))) {
356371
smart_str_appends_ex(buffer, "Host: ", persistent);
357372
smart_str_append_ex(buffer, Z_STR_P(val), persistent);
358373
smart_str_appends_ex(buffer, "\r\n", persistent);
359374
}
360375

361-
if (!gettimeofday(&tv, NULL)) {
376+
if (append_date_header && !gettimeofday(&tv, NULL)) {
362377
zend_string *dt = php_format_date("D, d M Y H:i:s", sizeof("D, d M Y H:i:s") - 1, tv.tv_sec, 0);
363378
smart_str_appends_ex(buffer, "Date: ", persistent);
364379
smart_str_append_ex(buffer, dt, persistent);
@@ -542,7 +557,7 @@ static int sapi_cli_server_send_headers(sapi_headers_struct *sapi_headers) /* {{
542557
append_http_status_line(&buffer, client->request.protocol_version, SG(sapi_headers).http_response_code, 0);
543558
}
544559

545-
append_essential_headers(&buffer, client, 0);
560+
append_essential_headers(&buffer, client, 0, sapi_headers);
546561

547562
h = (sapi_header_struct*)zend_llist_get_first_ex(&sapi_headers->headers, &pos);
548563
while (h) {
@@ -2039,7 +2054,7 @@ static zend_result php_cli_server_send_error_page(php_cli_server *server, php_cl
20392054
/* out of memory */
20402055
goto fail;
20412056
}
2042-
append_essential_headers(&buffer, client, 1);
2057+
append_essential_headers(&buffer, client, 1, NULL);
20432058
smart_str_appends_ex(&buffer, "Content-Type: text/html; charset=UTF-8\r\n", 1);
20442059
smart_str_appends_ex(&buffer, "Content-Length: ", 1);
20452060
smart_str_append_unsigned_ex(&buffer, php_cli_server_buffer_size(&client->content_sender.buffer), 1);
@@ -2155,7 +2170,7 @@ static zend_result php_cli_server_begin_send_static(php_cli_server *server, php_
21552170
php_cli_server_log_response(client, 500, NULL);
21562171
return FAILURE;
21572172
}
2158-
append_essential_headers(&buffer, client, 1);
2173+
append_essential_headers(&buffer, client, 1, NULL);
21592174
if (mime_type) {
21602175
smart_str_appendl_ex(&buffer, "Content-Type: ", sizeof("Content-Type: ") - 1, 1);
21612176
smart_str_appends_ex(&buffer, mime_type, 1);

sapi/cli/tests/gh12363.phpt

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
--TEST--
2+
Ensure a single Date header is present
3+
--SKIPIF--
4+
<?php
5+
include "skipif.inc";
6+
?>
7+
--FILE--
8+
<?php
9+
include "php_cli_server.inc";
10+
php_cli_server_start(<<<'PHP'
11+
header('Date: Mon, 25 Mar 1985 00:20:00 GMT');
12+
PHP
13+
);
14+
15+
$host = PHP_CLI_SERVER_HOSTNAME;
16+
$fp = php_cli_server_connect();
17+
18+
if(fwrite($fp, <<<HEADER
19+
GET / HTTP/1.1
20+
Host: {$host}
21+
22+
23+
HEADER
24+
)) {
25+
while (!feof($fp)) {
26+
echo fgets($fp);
27+
}
28+
}
29+
30+
fclose($fp);
31+
?>
32+
--EXPECTF--
33+
HTTP/1.1 200 OK
34+
Host: %s
35+
Connection: close
36+
X-Powered-By: %s
37+
Date: Mon, 25 Mar 1985 00:20:00 GMT
38+
Content-type: text/html; charset=UTF-8
39+

0 commit comments

Comments
 (0)