add json content type handler if ext/json is present
[m6w6/ext-http] / php_http_env.c
index 2fb6e33915fa1eb453fd1fc791bcc43502e4a187..09ee36c96366689378fe9889f61086a2653ad796 100644 (file)
@@ -32,7 +32,6 @@ PHP_RINIT_FUNCTION(http_env)
 
                ZEND_INIT_SYMTABLE(&params);
                if (php_http_params_parse(&params, &opts TSRMLS_CC)) {
-                       zval **zct;
                        char *key_str;
                        uint key_len;
                        ulong key_num;
@@ -605,7 +604,6 @@ PHP_HTTP_API const char *php_http_env_get_response_status_for_code(unsigned code
        return php_http_strlist_find(php_http_env_response_status, 100, code);
 }
 
-zend_class_entry *php_http_env_class_entry;
 
 #define PHP_HTTP_BEGIN_ARGS(method, req_args)  PHP_HTTP_BEGIN_ARGS_EX(HttpEnv, method, 0, req_args)
 #define PHP_HTTP_EMPTY_ARGS(method)                            PHP_HTTP_EMPTY_ARGS_EX(HttpEnv, method, 0)
@@ -674,7 +672,14 @@ PHP_HTTP_BEGIN_ARGS(cleanPersistentHandles, 0)
        PHP_HTTP_ARG_VAL(ident, 0)
 PHP_HTTP_END_ARGS;
 
-zend_function_entry php_http_env_method_entry[] = {
+static zend_class_entry *php_http_env_class_entry;
+
+zend_class_entry *php_http_env_get_class_entry(void)
+{
+       return php_http_env_class_entry;
+}
+
+static zend_function_entry php_http_env_method_entry[] = {
        PHP_HTTP_ENV_ME(getRequestHeader)
        PHP_HTTP_ENV_ME(getRequestBody)
 
@@ -722,14 +727,14 @@ PHP_METHOD(HttpEnv, getRequestHeader)
 
 PHP_METHOD(HttpEnv, getRequestBody)
 {
-       with_error_handling(EH_THROW, php_http_exception_class_entry) {
-               zend_class_entry *class_entry = php_http_message_body_class_entry;
+       with_error_handling(EH_THROW, php_http_exception_get_class_entry()) {
+               zend_class_entry *class_entry = php_http_message_body_get_class_entry();
 
                if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|C", &class_entry)) {
                        zend_object_value ov;
                        php_http_message_body_t *body = php_http_env_get_request_body(TSRMLS_C);
 
-                       if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_message_body_object_new_ex, php_http_message_body_class_entry, php_http_message_body_copy(body, NULL, 0), NULL TSRMLS_CC)) {
+                       if (SUCCESS == php_http_new(&ov, class_entry, (php_http_new_t) php_http_message_body_object_new_ex, php_http_message_body_get_class_entry(), php_http_message_body_copy(body, NULL, 0), NULL TSRMLS_CC)) {
                                RETVAL_OBJVAL(ov, 0);
                        }
                }
@@ -912,8 +917,35 @@ PHP_METHOD(HttpEnv, cleanPersistentHandles)
        }
 }
 
+#ifdef PHP_HTTP_HAVE_JSON
+#include "ext/json/php_json.h"
+
+static SAPI_POST_HANDLER_FUNC(php_http_json_post_handler)
+{
+       if (SG(request_info).raw_post_data) {
+               php_json_decode_ex(arg, SG(request_info).raw_post_data, SG(request_info).raw_post_data_length, PHP_JSON_OBJECT_AS_ARRAY, PG(max_input_nesting_level) TSRMLS_CC);
+       }
+}
+
+#endif
+
 PHP_MINIT_FUNCTION(http_env)
 {
+#ifdef PHP_HTTP_HAVE_JSON
+       sapi_post_entry entry = {NULL, 0, NULL, NULL};
+
+       entry.post_reader = sapi_read_standard_form_data;
+       entry.post_handler = php_http_json_post_handler;
+
+       entry.content_type = "text/json";
+       entry.content_type_len = lenof("text/json");
+       sapi_register_post_entry(&entry TSRMLS_CC);
+
+       entry.content_type = "application/json";
+       entry.content_type_len = lenof("application/json");
+       sapi_register_post_entry(&entry TSRMLS_CC);
+#endif
+
        PHP_HTTP_REGISTER_CLASS(http, Env, http_env, NULL, 0);
 
        return SUCCESS;