Blame SOURCES/php-7.2.8-getallheaders.patch

a247fe
Adapted for 7.2 from 7.3 by remi
a247fe
a247fe
a247fe
From 0ea4013f101d64fbeb9221260b36e98f10ed1ddd Mon Sep 17 00:00:00 2001
a247fe
From: Remi Collet <remi@remirepo.net>
a247fe
Date: Wed, 4 Jul 2018 08:48:38 +0200
a247fe
Subject: [PATCH] Fixed bug #62596 add getallheaders (apache_request_headers)
a247fe
 missing function in FPM add sapi_add_request_header in public API (was
a247fe
 add_request_header) fix arginfo for fastcgi_finish_request fucntion
a247fe
a247fe
---
a247fe
 main/SAPI.c                       | 50 +++++++++++++++++++++++++++++
a247fe
 main/SAPI.h                       |  1 +
a247fe
 sapi/cgi/cgi_main.c               | 51 +----------------------------
a247fe
 sapi/fpm/fpm/fpm_main.c           | 25 ++++++++++++++-
a247fe
 sapi/fpm/tests/getallheaders.phpt | 67 +++++++++++++++++++++++++++++++++++++++
a247fe
 5 files changed, 143 insertions(+), 51 deletions(-)
a247fe
 create mode 100644 sapi/fpm/tests/getallheaders.phpt
a247fe
a247fe
diff --git a/main/SAPI.c b/main/SAPI.c
a247fe
index b6c3329..7e0c7c8 100644
a247fe
--- a/main/SAPI.c
a247fe
+++ b/main/SAPI.c
a247fe
@@ -1109,6 +1109,56 @@ SAPI_API void sapi_terminate_process(void) {
a247fe
 	}
a247fe
 }
a247fe
 
a247fe
+SAPI_API void sapi_add_request_header(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg) /* {{{ */
a247fe
+{
a247fe
+	zval *return_value = (zval*)arg;
a247fe
+	char *str = NULL;
a247fe
+
a247fe
+	ALLOCA_FLAG(use_heap)
a247fe
+
a247fe
+	if (var_len > 5 &&
a247fe
+	    var[0] == 'H' &&
a247fe
+	    var[1] == 'T' &&
a247fe
+	    var[2] == 'T' &&
a247fe
+	    var[3] == 'P' &&
a247fe
+	    var[4] == '_') {
a247fe
+
a247fe
+		char *p;
a247fe
+
a247fe
+		var_len -= 5;
a247fe
+		p = var + 5;
a247fe
+		var = str = do_alloca(var_len + 1, use_heap);
a247fe
+		*str++ = *p++;
a247fe
+		while (*p) {
a247fe
+			if (*p == '_') {
a247fe
+				*str++ = '-';
a247fe
+				p++;
a247fe
+				if (*p) {
a247fe
+					*str++ = *p++;
a247fe
+				}
a247fe
+			} else if (*p >= 'A' && *p <= 'Z') {
a247fe
+				*str++ = (*p++ - 'A' + 'a');
a247fe
+			} else {
a247fe
+				*str++ = *p++;
a247fe
+			}
a247fe
+		}
a247fe
+		*str = 0;
a247fe
+	} else if (var_len == sizeof("CONTENT_TYPE")-1 &&
a247fe
+	           memcmp(var, "CONTENT_TYPE", sizeof("CONTENT_TYPE")-1) == 0) {
a247fe
+		var = "Content-Type";
a247fe
+	} else if (var_len == sizeof("CONTENT_LENGTH")-1 &&
a247fe
+	           memcmp(var, "CONTENT_LENGTH", sizeof("CONTENT_LENGTH")-1) == 0) {
a247fe
+		var = "Content-Length";
a247fe
+	} else {
a247fe
+		return;
a247fe
+	}
a247fe
+	add_assoc_stringl_ex(return_value, var, var_len, val, val_len);
a247fe
+	if (str) {
a247fe
+		free_alloca(var, use_heap);
a247fe
+	}
a247fe
+}
a247fe
+/* }}} */
a247fe
+
a247fe
 /*
a247fe
  * Local variables:
a247fe
  * tab-width: 4
a247fe
diff --git a/main/SAPI.h b/main/SAPI.h
a247fe
index f829fd7..4b8e223 100644
a247fe
--- a/main/SAPI.h
a247fe
+++ b/main/SAPI.h
a247fe
@@ -151,6 +151,7 @@ SAPI_API void sapi_shutdown(void);
a247fe
 SAPI_API void sapi_activate(void);
a247fe
 SAPI_API void sapi_deactivate(void);
a247fe
 SAPI_API void sapi_initialize_empty_request(void);
a247fe
+SAPI_API void sapi_add_request_header(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg);
a247fe
 END_EXTERN_C()
a247fe
 
a247fe
 /*
a247fe
diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c
a247fe
index 2e9cefe..350846d 100644
a247fe
--- a/sapi/cgi/cgi_main.c
a247fe
+++ b/sapi/cgi/cgi_main.c
a247fe
@@ -1591,54 +1591,6 @@ PHP_FUNCTION(apache_child_terminate) /*
a247fe
 }
a247fe
 /* }}} */
a247fe
 
a247fe
-static void add_request_header(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg) /* {{{ */
a247fe
-{
a247fe
-	zval *return_value = (zval*)arg;
a247fe
-	char *str = NULL;
a247fe
-	char *p;
a247fe
-	ALLOCA_FLAG(use_heap)
a247fe
-
a247fe
-	if (var_len > 5 &&
a247fe
-	    var[0] == 'H' &&
a247fe
-	    var[1] == 'T' &&
a247fe
-	    var[2] == 'T' &&
a247fe
-	    var[3] == 'P' &&
a247fe
-	    var[4] == '_') {
a247fe
-
a247fe
-		var_len -= 5;
a247fe
-		p = var + 5;
a247fe
-		var = str = do_alloca(var_len + 1, use_heap);
a247fe
-		*str++ = *p++;
a247fe
-		while (*p) {
a247fe
-			if (*p == '_') {
a247fe
-				*str++ = '-';
a247fe
-				p++;
a247fe
-				if (*p) {
a247fe
-					*str++ = *p++;
a247fe
-				}
a247fe
-			} else if (*p >= 'A' && *p <= 'Z') {
a247fe
-				*str++ = (*p++ - 'A' + 'a');
a247fe
-			} else {
a247fe
-				*str++ = *p++;
a247fe
-			}
a247fe
-		}
a247fe
-		*str = 0;
a247fe
-	} else if (var_len == sizeof("CONTENT_TYPE")-1 &&
a247fe
-	           memcmp(var, "CONTENT_TYPE", sizeof("CONTENT_TYPE")-1) == 0) {
a247fe
-		var = "Content-Type";
a247fe
-	} else if (var_len == sizeof("CONTENT_LENGTH")-1 &&
a247fe
-	           memcmp(var, "CONTENT_LENGTH", sizeof("CONTENT_LENGTH")-1) == 0) {
a247fe
-		var = "Content-Length";
a247fe
-	} else {
a247fe
-		return;
a247fe
-	}
a247fe
-	add_assoc_stringl_ex(return_value, var, var_len, val, val_len);
a247fe
-	if (str) {
a247fe
-		free_alloca(var, use_heap);
a247fe
-	}
a247fe
-}
a247fe
-/* }}} */
a247fe
-
a247fe
 PHP_FUNCTION(apache_request_headers) /* {{{ */
a247fe
 {
a247fe
 	if (zend_parse_parameters_none()) {
a247fe
@@ -1648,7 +1600,7 @@ PHP_FUNCTION(apache_request_headers) /*
a247fe
 	if (fcgi_is_fastcgi()) {
a247fe
 		fcgi_request *request = (fcgi_request*) SG(server_context);
a247fe
 
a247fe
-		fcgi_loadenv(request, add_request_header, return_value);
a247fe
+		fcgi_loadenv(request, sapi_add_request_header, return_value);
a247fe
 	} else {
a247fe
 		char buf[128];
a247fe
 		char **env, *p, *q, *var, *val, *t = buf;
a247fe
diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c
a247fe
index 3256660..e815be4 100644
a247fe
--- a/sapi/fpm/fpm/fpm_main.c
a247fe
+++ b/sapi/fpm/fpm/fpm_main.c
a247fe
@@ -1531,6 +1531,10 @@ PHP_FUNCTION(fastcgi_finish_request) /* {{{ */
a247fe
 {
a247fe
 	fcgi_request *request = (fcgi_request*) SG(server_context);
a247fe
 
a247fe
+	if (zend_parse_parameters_none() == FAILURE) {
a247fe
+		return;
a247fe
+	}
a247fe
+
a247fe
 	if (!fcgi_is_closed(request)) {
a247fe
 		php_output_end_all();
a247fe
 		php_header();
a247fe
@@ -1545,8 +1549,27 @@ PHP_FUNCTION(fastcgi_finish_request) /* {{{ */
a247fe
 }
a247fe
 /* }}} */
a247fe
 
a247fe
+ZEND_BEGIN_ARG_INFO(cgi_fcgi_sapi_no_arginfo, 0)
a247fe
+ZEND_END_ARG_INFO()
a247fe
+
a247fe
+PHP_FUNCTION(apache_request_headers) /* {{{ */
a247fe
+{
a247fe
+	fcgi_request *request;
a247fe
+
a247fe
+	if (zend_parse_parameters_none() == FAILURE) {
a247fe
+		return;
a247fe
+	}
a247fe
+
a247fe
+	array_init(return_value);
a247fe
+	if ((request = (fcgi_request*) SG(server_context))) {
a247fe
+		fcgi_loadenv(request, sapi_add_request_header, return_value);
a247fe
+	}
a247fe
+} /* }}} */
a247fe
+
a247fe
 static const zend_function_entry cgi_fcgi_sapi_functions[] = {
a247fe
-	PHP_FE(fastcgi_finish_request,              NULL)
a247fe
+	PHP_FE(fastcgi_finish_request,                    cgi_fcgi_sapi_no_arginfo)
a247fe
+	PHP_FE(apache_request_headers,                    cgi_fcgi_sapi_no_arginfo)
a247fe
+	PHP_FALIAS(getallheaders, apache_request_headers, cgi_fcgi_sapi_no_arginfo)
a247fe
 	PHP_FE_END
a247fe
 };
a247fe
 
a247fe
diff --git a/sapi/fpm/tests/getallheaders.phpt b/sapi/fpm/tests/getallheaders.phpt
a247fe
new file mode 100644
a247fe
index 0000000..b41f1c6
a247fe
--- /dev/null
a247fe
+++ b/sapi/fpm/tests/getallheaders.phpt
a247fe
@@ -0,0 +1,67 @@
a247fe
+--TEST--
a247fe
+FPM: Function getallheaders basic test
a247fe
+--SKIPIF--
a247fe
+
a247fe
+--FILE--
a247fe
+
a247fe
+
a247fe
+require_once "tester.inc";
a247fe
+
a247fe
+$cfg = <<
a247fe
+[global]
a247fe
+error_log = {{FILE:LOG}}
a247fe
+[unconfined]
a247fe
+listen = {{ADDR}}
a247fe
+pm = dynamic
a247fe
+pm.max_children = 5
a247fe
+pm.start_servers = 1
a247fe
+pm.min_spare_servers = 1
a247fe
+pm.max_spare_servers = 3
a247fe
+EOT;
a247fe
+
a247fe
+$code = <<
a247fe
+
a247fe
+echo "Test Start\n";
a247fe
+var_dump(getallheaders());
a247fe
+echo "Test End\n";
a247fe
+EOT;
a247fe
+
a247fe
+$headers = [];
a247fe
+$tester = new FPM\Tester($cfg, $code);
a247fe
+$tester->start();
a247fe
+$tester->expectLogStartNotices();
a247fe
+$tester->request(
a247fe
+		'', 
a247fe
+		[
a247fe
+			'HTTP_X_FOO' => 'BAR',
a247fe
+			'HTTP_FOO'   => 'foo'
a247fe
+		]
a247fe
+	)->expectBody(
a247fe
+		[
a247fe
+			'Test Start',
a247fe
+			'array(4) {',
a247fe
+			'  ["Foo"]=>',
a247fe
+			'  string(3) "foo"',
a247fe
+			'  ["X-Foo"]=>',
a247fe
+			'  string(3) "BAR"',
a247fe
+			'  ["Content-Length"]=>',
a247fe
+			'  string(1) "0"',
a247fe
+			'  ["Content-Type"]=>',
a247fe
+			'  string(0) ""',
a247fe
+			'}',
a247fe
+			'Test End',
a247fe
+		]
a247fe
+	);
a247fe
+$tester->terminate();
a247fe
+$tester->expectLogTerminatingNotices();
a247fe
+$tester->close();
a247fe
+
a247fe
+?>
a247fe
+Done
a247fe
+--EXPECT--
a247fe
+Done
a247fe
+--CLEAN--
a247fe
+
a247fe
+require_once "tester.inc";
a247fe
+FPM\Tester::clean();
a247fe
+?>
a247fe
-- 
a247fe
2.1.4
a247fe