add population of _POST and _FILES for non-POST requests; release 2.0.0dev9
authorMichael Wallner <mike@php.net>
Fri, 23 Mar 2012 13:43:02 +0000 (13:43 +0000)
committerMichael Wallner <mike@php.net>
Fri, 23 Mar 2012 13:43:02 +0000 (13:43 +0000)
package.xml
php_http.h
php_http_env.c

index 45467499bd9b5d57202007dbbcbe9811fd415d42..6aceaccf02da2e84ef29d7762a2b06ff1e0e044d 100644 (file)
@@ -27,9 +27,9 @@ Extended HTTP support. Again. Keep in mind that it's got the major version 2, be
   <email>mike@php.net</email>
   <active>yes</active>
  </lead>
- <date>2012-03-16</date>
+ <date>2012-03-23</date>
  <version>
-  <release>2.0.0dev</release>
+  <release>2.0.0dev9</release>
   <api>2.0.0</api>
  </version>
  <stability>
@@ -38,6 +38,7 @@ Extended HTTP support. Again. Keep in mind that it's got the major version 2, be
  </stability>
  <license>BSD, revised</license>
  <notes><![CDATA[
++ Added population of $_POST and $_FILES for non-POST requests
 - Renamed http\Env\Request::getPost() to ::getForm()
 - Changed http\Env\Response::setContentDisposition() to take an http\Params like array as argument
 - Removed http\Env\Response::CONTENT_DISPOSOTION_* constants
index e8d5e40fb235e02458a16553125ceaf165626e96..de67ea354200f2d924a5ecabe83821860c40b6f9 100644 (file)
@@ -13,7 +13,7 @@
 #ifndef PHP_EXT_HTTP_H
 #define PHP_EXT_HTTP_H
 
-#define PHP_HTTP_EXT_VERSION "2.0.0dev"
+#define PHP_HTTP_EXT_VERSION "2.0.0dev9"
 
 extern zend_module_entry http_module_entry;
 #define phpext_http_ptr &http_module_entry
index 96c757be07463be4fa3a3ec9d4b390e5ea3fed42..2fb6e33915fa1eb453fd1fc791bcc43502e4a187 100644 (file)
 */
 
 #include "php_http_api.h"
+#include "php_variables.h"
 
 PHP_RINIT_FUNCTION(http_env)
 {
        PHP_HTTP_G->env.request.time = sapi_get_request_time(TSRMLS_C);
 
+       /* populate form data on non-POST requests */
+       if (SG(request_info).request_method && strcasecmp(SG(request_info).request_method, "POST") && SG(request_info).content_type && *SG(request_info).content_type) {
+               uint ct_len = strlen(SG(request_info).content_type);
+               char *ct_str = estrndup(SG(request_info).content_type, ct_len);
+               php_http_params_opts_t opts;
+               HashTable params;
+
+               php_http_params_opts_default_get(&opts);
+               opts.input.str = ct_str;
+               opts.input.len = ct_len;
+
+               SG(request_info).content_type_dup = ct_str;
+
+               ZEND_INIT_SYMTABLE(&params);
+               if (php_http_params_parse(&params, &opts TSRMLS_CC)) {
+                       zval **zct;
+                       char *key_str;
+                       uint key_len;
+                       ulong key_num;
+
+                       if (HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(&params, &key_str, &key_len, &key_num, 0, NULL)) {
+                               sapi_post_entry *post_entry = NULL;
+
+                               if (SUCCESS == zend_hash_find(&SG(known_post_content_types), key_str, key_len, (void *) &post_entry)) {
+                                       zval *files = PG(http_globals)[TRACK_VARS_FILES];
+
+                                       zend_is_auto_global(ZEND_STRL("_POST") TSRMLS_CC);
+
+                                       if (post_entry) {
+                                               SG(request_info).post_entry = post_entry;
+
+                                               if (post_entry->post_reader) {
+                                                       post_entry->post_reader(TSRMLS_C);
+                                               }
+                                       }
+
+                                       if (sapi_module.default_post_reader) {
+                                               sapi_module.default_post_reader(TSRMLS_C);
+                                       }
+
+                                       sapi_handle_post(PG(http_globals)[TRACK_VARS_POST] TSRMLS_CC);
+
+                                       /*
+                                        * the rfc1867 handler is an awkward buddy
+                                        */
+                                       if (files != PG(http_globals)[TRACK_VARS_FILES] && PG(http_globals)[TRACK_VARS_FILES]) {
+                                               Z_ADDREF_P(PG(http_globals)[TRACK_VARS_FILES]);
+                                               zend_hash_update(&EG(symbol_table), "_FILES", sizeof("_FILES"), &PG(http_globals)[TRACK_VARS_FILES], sizeof(zval *), NULL);
+                                               if (files) {
+                                                       zval_ptr_dtor(&files);
+                                               }
+                                       }
+                               }
+                       }
+                       zend_hash_destroy(&params);
+               }
+       }
+
+       STR_SET(SG(request_info).content_type_dup, NULL);
+
        return SUCCESS;
 }