Skip to content

Commit 0ea4013

Browse files
committed
Fixed bug #62596 add getallheaders (apache_request_headers) missing function in FPM add sapi_add_request_header in public API (was add_request_header) fix arginfo for fastcgi_finish_request fucntion
1 parent 6c0ddcd commit 0ea4013

File tree

5 files changed

+143
-51
lines changed

5 files changed

+143
-51
lines changed

main/SAPI.c

+50
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,56 @@ SAPI_API void sapi_terminate_process(void) {
11091109
}
11101110
}
11111111

1112+
SAPI_API void sapi_add_request_header(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg) /* {{{ */
1113+
{
1114+
zval *return_value = (zval*)arg;
1115+
char *str = NULL;
1116+
1117+
ALLOCA_FLAG(use_heap)
1118+
1119+
if (var_len > 5 &&
1120+
var[0] == 'H' &&
1121+
var[1] == 'T' &&
1122+
var[2] == 'T' &&
1123+
var[3] == 'P' &&
1124+
var[4] == '_') {
1125+
1126+
char *p;
1127+
1128+
var_len -= 5;
1129+
p = var + 5;
1130+
var = str = do_alloca(var_len + 1, use_heap);
1131+
*str++ = *p++;
1132+
while (*p) {
1133+
if (*p == '_') {
1134+
*str++ = '-';
1135+
p++;
1136+
if (*p) {
1137+
*str++ = *p++;
1138+
}
1139+
} else if (*p >= 'A' && *p <= 'Z') {
1140+
*str++ = (*p++ - 'A' + 'a');
1141+
} else {
1142+
*str++ = *p++;
1143+
}
1144+
}
1145+
*str = 0;
1146+
} else if (var_len == sizeof("CONTENT_TYPE")-1 &&
1147+
memcmp(var, "CONTENT_TYPE", sizeof("CONTENT_TYPE")-1) == 0) {
1148+
var = "Content-Type";
1149+
} else if (var_len == sizeof("CONTENT_LENGTH")-1 &&
1150+
memcmp(var, "CONTENT_LENGTH", sizeof("CONTENT_LENGTH")-1) == 0) {
1151+
var = "Content-Length";
1152+
} else {
1153+
return;
1154+
}
1155+
add_assoc_stringl_ex(return_value, var, var_len, val, val_len);
1156+
if (str) {
1157+
free_alloca(var, use_heap);
1158+
}
1159+
}
1160+
/* }}} */
1161+
11121162
/*
11131163
* Local variables:
11141164
* tab-width: 4

main/SAPI.h

+1
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ SAPI_API void sapi_shutdown(void);
151151
SAPI_API void sapi_activate(void);
152152
SAPI_API void sapi_deactivate(void);
153153
SAPI_API void sapi_initialize_empty_request(void);
154+
SAPI_API void sapi_add_request_header(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg);
154155
END_EXTERN_C()
155156

156157
/*

sapi/cgi/cgi_main.c

+1-50
Original file line numberDiff line numberDiff line change
@@ -1590,55 +1590,6 @@ PHP_FUNCTION(apache_child_terminate) /* {{{ */
15901590
}
15911591
/* }}} */
15921592

1593-
static void add_request_header(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg) /* {{{ */
1594-
{
1595-
zval *return_value = (zval*)arg;
1596-
char *str = NULL;
1597-
1598-
ALLOCA_FLAG(use_heap)
1599-
1600-
if (var_len > 5 &&
1601-
var[0] == 'H' &&
1602-
var[1] == 'T' &&
1603-
var[2] == 'T' &&
1604-
var[3] == 'P' &&
1605-
var[4] == '_') {
1606-
1607-
char *p;
1608-
1609-
var_len -= 5;
1610-
p = var + 5;
1611-
var = str = do_alloca(var_len + 1, use_heap);
1612-
*str++ = *p++;
1613-
while (*p) {
1614-
if (*p == '_') {
1615-
*str++ = '-';
1616-
p++;
1617-
if (*p) {
1618-
*str++ = *p++;
1619-
}
1620-
} else if (*p >= 'A' && *p <= 'Z') {
1621-
*str++ = (*p++ - 'A' + 'a');
1622-
} else {
1623-
*str++ = *p++;
1624-
}
1625-
}
1626-
*str = 0;
1627-
} else if (var_len == sizeof("CONTENT_TYPE")-1 &&
1628-
memcmp(var, "CONTENT_TYPE", sizeof("CONTENT_TYPE")-1) == 0) {
1629-
var = "Content-Type";
1630-
} else if (var_len == sizeof("CONTENT_LENGTH")-1 &&
1631-
memcmp(var, "CONTENT_LENGTH", sizeof("CONTENT_LENGTH")-1) == 0) {
1632-
var = "Content-Length";
1633-
} else {
1634-
return;
1635-
}
1636-
add_assoc_stringl_ex(return_value, var, var_len, val, val_len);
1637-
if (str) {
1638-
free_alloca(var, use_heap);
1639-
}
1640-
}
1641-
/* }}} */
16421593

16431594
PHP_FUNCTION(apache_request_headers) /* {{{ */
16441595
{
@@ -1649,7 +1600,7 @@ PHP_FUNCTION(apache_request_headers) /* {{{ */
16491600
if (fcgi_is_fastcgi()) {
16501601
fcgi_request *request = (fcgi_request*) SG(server_context);
16511602

1652-
fcgi_loadenv(request, add_request_header, return_value);
1603+
fcgi_loadenv(request, sapi_add_request_header, return_value);
16531604
} else {
16541605
char buf[128];
16551606
char **env, *p, *q, *var, *val, *t = buf;

sapi/fpm/fpm/fpm_main.c

+24-1
Original file line numberDiff line numberDiff line change
@@ -1531,6 +1531,10 @@ PHP_FUNCTION(fastcgi_finish_request) /* {{{ */
15311531
{
15321532
fcgi_request *request = (fcgi_request*) SG(server_context);
15331533

1534+
if (zend_parse_parameters_none() == FAILURE) {
1535+
return;
1536+
}
1537+
15341538
if (!fcgi_is_closed(request)) {
15351539
php_output_end_all();
15361540
php_header();
@@ -1545,8 +1549,27 @@ PHP_FUNCTION(fastcgi_finish_request) /* {{{ */
15451549
}
15461550
/* }}} */
15471551

1552+
ZEND_BEGIN_ARG_INFO(cgi_fcgi_sapi_no_arginfo, 0)
1553+
ZEND_END_ARG_INFO()
1554+
1555+
PHP_FUNCTION(apache_request_headers) /* {{{ */
1556+
{
1557+
fcgi_request *request;
1558+
1559+
if (zend_parse_parameters_none() == FAILURE) {
1560+
return;
1561+
}
1562+
1563+
array_init(return_value);
1564+
if ((request = (fcgi_request*) SG(server_context))) {
1565+
fcgi_loadenv(request, sapi_add_request_header, return_value);
1566+
}
1567+
} /* }}} */
1568+
15481569
static const zend_function_entry cgi_fcgi_sapi_functions[] = {
1549-
PHP_FE(fastcgi_finish_request, NULL)
1570+
PHP_FE(fastcgi_finish_request, cgi_fcgi_sapi_no_arginfo)
1571+
PHP_FE(apache_request_headers, cgi_fcgi_sapi_no_arginfo)
1572+
PHP_FALIAS(getallheaders, apache_request_headers, cgi_fcgi_sapi_no_arginfo)
15501573
PHP_FE_END
15511574
};
15521575

sapi/fpm/tests/getallheaders.phpt

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
--TEST--
2+
FPM: Function getallheaders basic test
3+
--SKIPIF--
4+
<?php include "skipif.inc"; ?>
5+
--FILE--
6+
<?php
7+
8+
require_once "tester.inc";
9+
10+
$cfg = <<<EOT
11+
[global]
12+
error_log = {{FILE:LOG}}
13+
[unconfined]
14+
listen = {{ADDR}}
15+
pm = dynamic
16+
pm.max_children = 5
17+
pm.start_servers = 1
18+
pm.min_spare_servers = 1
19+
pm.max_spare_servers = 3
20+
EOT;
21+
22+
$code = <<<EOT
23+
<?php
24+
echo "Test Start\n";
25+
var_dump(getallheaders());
26+
echo "Test End\n";
27+
EOT;
28+
29+
$headers = [];
30+
$tester = new FPM\Tester($cfg, $code);
31+
$tester->start();
32+
$tester->expectLogStartNotices();
33+
$tester->request(
34+
'',
35+
[
36+
'HTTP_X_FOO' => 'BAR',
37+
'HTTP_FOO' => 'foo'
38+
]
39+
)->expectBody(
40+
[
41+
'Test Start',
42+
'array(4) {',
43+
' ["Foo"]=>',
44+
' string(3) "foo"',
45+
' ["X-Foo"]=>',
46+
' string(3) "BAR"',
47+
' ["Content-Length"]=>',
48+
' string(1) "0"',
49+
' ["Content-Type"]=>',
50+
' string(0) ""',
51+
'}',
52+
'Test End',
53+
]
54+
);
55+
$tester->terminate();
56+
$tester->expectLogTerminatingNotices();
57+
$tester->close();
58+
59+
?>
60+
Done
61+
--EXPECT--
62+
Done
63+
--CLEAN--
64+
<?php
65+
require_once "tester.inc";
66+
FPM\Tester::clean();
67+
?>

0 commit comments

Comments
 (0)