]> granicus.if.org Git - php/commitdiff
Fixed bug #62596 add getallheaders (apache_request_headers) missing function in FPM...
authorRemi Collet <remi@remirepo.net>
Wed, 4 Jul 2018 06:48:38 +0000 (08:48 +0200)
committerRemi Collet <remi@php.net>
Thu, 5 Jul 2018 04:30:58 +0000 (06:30 +0200)
main/SAPI.c
main/SAPI.h
sapi/cgi/cgi_main.c
sapi/fpm/fpm/fpm_main.c
sapi/fpm/tests/getallheaders.phpt [new file with mode: 0644]

index b6c3329d33c97c98411e451003cad06d42dd57a5..7e0c7c8a76b1202b5e7ff45375d20c93a222fcd9 100644 (file)
@@ -1109,6 +1109,56 @@ SAPI_API void sapi_terminate_process(void) {
        }
 }
 
+SAPI_API void sapi_add_request_header(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg) /* {{{ */
+{
+       zval *return_value = (zval*)arg;
+       char *str = NULL;
+
+       ALLOCA_FLAG(use_heap)
+
+       if (var_len > 5 &&
+           var[0] == 'H' &&
+           var[1] == 'T' &&
+           var[2] == 'T' &&
+           var[3] == 'P' &&
+           var[4] == '_') {
+
+               char *p;
+
+               var_len -= 5;
+               p = var + 5;
+               var = str = do_alloca(var_len + 1, use_heap);
+               *str++ = *p++;
+               while (*p) {
+                       if (*p == '_') {
+                               *str++ = '-';
+                               p++;
+                               if (*p) {
+                                       *str++ = *p++;
+                               }
+                       } else if (*p >= 'A' && *p <= 'Z') {
+                               *str++ = (*p++ - 'A' + 'a');
+                       } else {
+                               *str++ = *p++;
+                       }
+               }
+               *str = 0;
+       } else if (var_len == sizeof("CONTENT_TYPE")-1 &&
+                  memcmp(var, "CONTENT_TYPE", sizeof("CONTENT_TYPE")-1) == 0) {
+               var = "Content-Type";
+       } else if (var_len == sizeof("CONTENT_LENGTH")-1 &&
+                  memcmp(var, "CONTENT_LENGTH", sizeof("CONTENT_LENGTH")-1) == 0) {
+               var = "Content-Length";
+       } else {
+               return;
+       }
+       add_assoc_stringl_ex(return_value, var, var_len, val, val_len);
+       if (str) {
+               free_alloca(var, use_heap);
+       }
+}
+/* }}} */
+
 /*
  * Local variables:
  * tab-width: 4
index f829fd77ff346ea0e6caff755289816c467d20a6..4b8e223ada19818cfec95658a5192b21a981e9c5 100644 (file)
@@ -151,6 +151,7 @@ SAPI_API void sapi_shutdown(void);
 SAPI_API void sapi_activate(void);
 SAPI_API void sapi_deactivate(void);
 SAPI_API void sapi_initialize_empty_request(void);
+SAPI_API void sapi_add_request_header(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg);
 END_EXTERN_C()
 
 /*
index 2e9cefedeaf6bb7e22a89ddf54d84d5e3663b8c3..350846d7f775dc5df8168c4aec988bfdf27c66b9 100644 (file)
@@ -1590,55 +1590,6 @@ PHP_FUNCTION(apache_child_terminate) /* {{{ */
 }
 /* }}} */
 
-static void add_request_header(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg) /* {{{ */
-{
-       zval *return_value = (zval*)arg;
-       char *str = NULL;
-
-       ALLOCA_FLAG(use_heap)
-
-       if (var_len > 5 &&
-           var[0] == 'H' &&
-           var[1] == 'T' &&
-           var[2] == 'T' &&
-           var[3] == 'P' &&
-           var[4] == '_') {
-
-               char *p;
-
-               var_len -= 5;
-               p = var + 5;
-               var = str = do_alloca(var_len + 1, use_heap);
-               *str++ = *p++;
-               while (*p) {
-                       if (*p == '_') {
-                               *str++ = '-';
-                               p++;
-                               if (*p) {
-                                       *str++ = *p++;
-                               }
-                       } else if (*p >= 'A' && *p <= 'Z') {
-                               *str++ = (*p++ - 'A' + 'a');
-                       } else {
-                               *str++ = *p++;
-                       }
-               }
-               *str = 0;
-       } else if (var_len == sizeof("CONTENT_TYPE")-1 &&
-                  memcmp(var, "CONTENT_TYPE", sizeof("CONTENT_TYPE")-1) == 0) {
-               var = "Content-Type";
-       } else if (var_len == sizeof("CONTENT_LENGTH")-1 &&
-                  memcmp(var, "CONTENT_LENGTH", sizeof("CONTENT_LENGTH")-1) == 0) {
-               var = "Content-Length";
-       } else {
-               return;
-       }
-       add_assoc_stringl_ex(return_value, var, var_len, val, val_len);
-       if (str) {
-               free_alloca(var, use_heap);
-       }
-}
-/* }}} */
 
 PHP_FUNCTION(apache_request_headers) /* {{{ */
 {
@@ -1649,7 +1600,7 @@ PHP_FUNCTION(apache_request_headers) /* {{{ */
        if (fcgi_is_fastcgi()) {
                fcgi_request *request = (fcgi_request*) SG(server_context);
 
-               fcgi_loadenv(request, add_request_header, return_value);
+               fcgi_loadenv(request, sapi_add_request_header, return_value);
        } else {
                char buf[128];
                char **env, *p, *q, *var, *val, *t = buf;
index 32566602642ab71603745b87461a5556b475c923..e815be47000df6767cf3ac25fd40a950125b41c7 100644 (file)
@@ -1531,6 +1531,10 @@ PHP_FUNCTION(fastcgi_finish_request) /* {{{ */
 {
        fcgi_request *request = (fcgi_request*) SG(server_context);
 
+       if (zend_parse_parameters_none() == FAILURE) {
+               return;
+       }
+
        if (!fcgi_is_closed(request)) {
                php_output_end_all();
                php_header();
@@ -1545,8 +1549,27 @@ PHP_FUNCTION(fastcgi_finish_request) /* {{{ */
 }
 /* }}} */
 
+ZEND_BEGIN_ARG_INFO(cgi_fcgi_sapi_no_arginfo, 0)
+ZEND_END_ARG_INFO()
+
+PHP_FUNCTION(apache_request_headers) /* {{{ */
+{
+       fcgi_request *request;
+
+       if (zend_parse_parameters_none() == FAILURE) {
+               return;
+       }
+
+       array_init(return_value);
+       if ((request = (fcgi_request*) SG(server_context))) {
+               fcgi_loadenv(request, sapi_add_request_header, return_value);
+       }
+} /* }}} */
+
 static const zend_function_entry cgi_fcgi_sapi_functions[] = {
-       PHP_FE(fastcgi_finish_request,              NULL)
+       PHP_FE(fastcgi_finish_request,                    cgi_fcgi_sapi_no_arginfo)
+       PHP_FE(apache_request_headers,                    cgi_fcgi_sapi_no_arginfo)
+       PHP_FALIAS(getallheaders, apache_request_headers, cgi_fcgi_sapi_no_arginfo)
        PHP_FE_END
 };
 
diff --git a/sapi/fpm/tests/getallheaders.phpt b/sapi/fpm/tests/getallheaders.phpt
new file mode 100644 (file)
index 0000000..b41f1c6
--- /dev/null
@@ -0,0 +1,67 @@
+--TEST--
+FPM: Function getallheaders basic test
+--SKIPIF--
+<?php include "skipif.inc"; ?>
+--FILE--
+<?php
+
+require_once "tester.inc";
+
+$cfg = <<<EOT
+[global]
+error_log = {{FILE:LOG}}
+[unconfined]
+listen = {{ADDR}}
+pm = dynamic
+pm.max_children = 5
+pm.start_servers = 1
+pm.min_spare_servers = 1
+pm.max_spare_servers = 3
+EOT;
+
+$code = <<<EOT
+<?php
+echo "Test Start\n";
+var_dump(getallheaders());
+echo "Test End\n";
+EOT;
+
+$headers = [];
+$tester = new FPM\Tester($cfg, $code);
+$tester->start();
+$tester->expectLogStartNotices();
+$tester->request(
+               '', 
+               [
+                       'HTTP_X_FOO' => 'BAR',
+                       'HTTP_FOO'   => 'foo'
+               ]
+       )->expectBody(
+               [
+                       'Test Start',
+                       'array(4) {',
+                       '  ["Foo"]=>',
+                       '  string(3) "foo"',
+                       '  ["X-Foo"]=>',
+                       '  string(3) "BAR"',
+                       '  ["Content-Length"]=>',
+                       '  string(1) "0"',
+                       '  ["Content-Type"]=>',
+                       '  string(0) ""',
+                       '}',
+                       'Test End',
+               ]
+       );
+$tester->terminate();
+$tester->expectLogTerminatingNotices();
+$tester->close();
+
+?>
+Done
+--EXPECT--
+Done
+--CLEAN--
+<?php
+require_once "tester.inc";
+FPM\Tester::clean();
+?>