]> granicus.if.org Git - php/commitdiff
re-introduce always_populate_raw_post_data
authorMichael Wallner <mike@php.net>
Tue, 26 Nov 2013 14:03:37 +0000 (15:03 +0100)
committerMichael Wallner <mike@php.net>
Mon, 30 Dec 2013 13:28:42 +0000 (14:28 +0100)
main/main.c
main/php_content_types.c
main/php_globals.h
tests/basic/024.phpt [new file with mode: 0644]
tests/basic/026.phpt [new file with mode: 0644]

index 04338e76c79257e23989bf9b044f10826ca8d8cf..fdcf2b0a5b285d00efbb57b5f134d1fb762e8254 100644 (file)
@@ -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)
index 3346efc50ec6eb27edbc88ff624b986fac01c9b9..d15f6a709d47ed57c58c4755b9497c7c4e7743fc 100644 (file)
@@ -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);
+               }
        }
 }
 /* }}} */
index fa2fe3b2329623f7053e2695d599684f490fda27..49647b0a55017548deaccca30e687177d1d46622 100644 (file)
@@ -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 (file)
index 0000000..bf8a206
--- /dev/null
@@ -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 (file)
index 0000000..b98a31f
--- /dev/null
@@ -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"