summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Wallner <mike@php.net>2013-11-26 15:03:37 +0100
committerMichael Wallner <mike@php.net>2013-12-30 14:28:42 +0100
commit3641507fc1a854ec56135740f528d5d428920833 (patch)
treef2ac9f97f96102a68e986cb5c6f8dc3e7b8b963b
parent71a36fb6aeb7b51b2819d857162564dbbbccae59 (diff)
downloadphp-git-3641507fc1a854ec56135740f528d5d428920833.tar.gz
re-introduce always_populate_raw_post_data
-rw-r--r--main/main.c32
-rw-r--r--main/php_content_types.c24
-rw-r--r--main/php_globals.h1
-rw-r--r--tests/basic/024.phpt28
-rw-r--r--tests/basic/026.phpt15
5 files changed, 100 insertions, 0 deletions
diff --git a/main/main.c b/main/main.c
index 04338e76c7..fdcf2b0a5b 100644
--- a/main/main.c
+++ b/main/main.c
@@ -460,6 +460,37 @@ static PHP_INI_MH(OnChangeMailForceExtra)
/* defined in browscap.c */
PHP_INI_MH(OnChangeBrowscap);
+/* {{{ PHP_INI_MH
+ */
+static PHP_INI_MH(OnChangeAlwaysPopulateRawPostData)
+{
+ signed char *p;
+#ifndef ZTS
+ char *base = (char *) mh_arg2;
+#else
+ char *base;
+
+ base = (char *) ts_resource(*((int *) mh_arg2));
+#endif
+
+ p = (signed char *) (base+(size_t) mh_arg1);
+
+ *p = zend_atol(new_value, new_value_length);
+ if (new_value_length == 2 && strcasecmp("on", new_value) == 0) {
+ *p = (signed char) 1;
+ }
+ else if (new_value_length == 3 && strcasecmp("yes", new_value) == 0) {
+ *p = (signed char) 1;
+ }
+ else if (new_value_length == 4 && strcasecmp("true", new_value) == 0) {
+ *p = (signed char) 1;
+ }
+ else {
+ *p = (signed char) atoi(new_value);
+ }
+ return SUCCESS;
+}
+/* }}} */
/* Need to be read from the environment (?):
* PHP_AUTO_PREPEND_FILE
@@ -562,6 +593,7 @@ PHP_INI_BEGIN()
STD_PHP_INI_BOOLEAN("allow_url_fopen", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_url_fopen, php_core_globals, core_globals)
STD_PHP_INI_BOOLEAN("allow_url_include", "0", PHP_INI_SYSTEM, OnUpdateBool, allow_url_include, php_core_globals, core_globals)
STD_PHP_INI_BOOLEAN("enable_post_data_reading", "1", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, enable_post_data_reading, php_core_globals, core_globals)
+ STD_PHP_INI_BOOLEAN("always_populate_raw_post_data","0",PHP_INI_SYSTEM|PHP_INI_PERDIR, OnChangeAlwaysPopulateRawPostData, always_populate_raw_post_data, php_core_globals, core_globals)
STD_PHP_INI_ENTRY("realpath_cache_size", "16K", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_size_limit, virtual_cwd_globals, cwd_globals)
STD_PHP_INI_ENTRY("realpath_cache_ttl", "120", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_ttl, virtual_cwd_globals, cwd_globals)
diff --git a/main/php_content_types.c b/main/php_content_types.c
index 3346efc50e..d15f6a709d 100644
--- a/main/php_content_types.c
+++ b/main/php_content_types.c
@@ -33,6 +33,19 @@ static sapi_post_entry php_post_entries[] = {
};
/* }}} */
+static zend_bool populate_raw_post_data(TSRMLS_D)
+{
+ if (!SG(request_info).request_body) {
+ return (zend_bool) 0;
+ }
+
+ if (!PG(always_populate_raw_post_data)) {
+ return (zend_bool) !SG(request_info).post_entry;
+ }
+
+ return (zend_bool) (PG(always_populate_raw_post_data) > 0);
+}
+
/* {{{ SAPI_POST_READER_FUNC
*/
SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader)
@@ -42,6 +55,17 @@ SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader)
/* no post handler registered, so we just swallow the data */
sapi_read_standard_form_data(TSRMLS_C);
}
+
+ if (populate_raw_post_data(TSRMLS_C)) {
+ size_t length;
+ char *data = NULL;
+
+ php_stream_rewind(SG(request_info).request_body);
+ length = php_stream_copy_to_mem(SG(request_info).request_body, &data, PHP_STREAM_COPY_ALL, 0);
+ php_stream_rewind(SG(request_info).request_body);
+
+ SET_VAR_STRINGL("HTTP_RAW_POST_DATA", data, length);
+ }
}
}
/* }}} */
diff --git a/main/php_globals.h b/main/php_globals.h
index fa2fe3b232..49647b0a55 100644
--- a/main/php_globals.h
+++ b/main/php_globals.h
@@ -132,6 +132,7 @@ struct _php_core_globals {
zend_bool allow_url_fopen;
zend_bool enable_post_data_reading;
zend_bool report_zend_debug;
+ long always_populate_raw_post_data;
int last_error_type;
char *last_error_message;
diff --git a/tests/basic/024.phpt b/tests/basic/024.phpt
new file mode 100644
index 0000000000..bf8a206b3a
--- /dev/null
+++ b/tests/basic/024.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Test HTTP_RAW_POST_DATA creation
+--INI--
+always_populate_raw_post_data=1
+max_input_vars=1000
+--POST--
+a=ABC&y=XYZ&c[]=1&c[]=2&c[a]=3
+--FILE--
+<?php
+var_dump($_POST, $HTTP_RAW_POST_DATA);
+?>
+--EXPECT--
+array(3) {
+ ["a"]=>
+ string(3) "ABC"
+ ["y"]=>
+ string(3) "XYZ"
+ ["c"]=>
+ array(3) {
+ [0]=>
+ string(1) "1"
+ [1]=>
+ string(1) "2"
+ ["a"]=>
+ string(1) "3"
+ }
+}
+string(30) "a=ABC&y=XYZ&c[]=1&c[]=2&c[a]=3"
diff --git a/tests/basic/026.phpt b/tests/basic/026.phpt
new file mode 100644
index 0000000000..b98a31f430
--- /dev/null
+++ b/tests/basic/026.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Registration of HTTP_RAW_POST_DATA due to unknown content-type
+--INI--
+always_populate_raw_post_data=0
+--POST_RAW--
+Content-Type: unknown/type
+a=1&b=ZYX
+--FILE--
+<?php
+var_dump($_POST, $HTTP_RAW_POST_DATA);
+?>
+--EXPECT--
+array(0) {
+}
+string(9) "a=1&b=ZYX"