fixes for windows and 5.3 compatibility
[m6w6/ext-http] / php_http_env.c
index 2fb6e33915fa1eb453fd1fc791bcc43502e4a187..f73be2053eb8815331df6dcbffff6f5c931cf5e2 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;
@@ -554,6 +553,7 @@ PHP_HTTP_API STATUS php_http_env_set_response_header_value(long http_code, const
 static PHP_HTTP_STRLIST(php_http_env_response_status) =
        PHP_HTTP_STRLIST_ITEM("Continue")
        PHP_HTTP_STRLIST_ITEM("Switching Protocols")
+       PHP_HTTP_STRLIST_ITEM("Processing")
        PHP_HTTP_STRLIST_NEXT
        PHP_HTTP_STRLIST_ITEM("OK")
        PHP_HTTP_STRLIST_ITEM("Created")
@@ -562,6 +562,26 @@ static PHP_HTTP_STRLIST(php_http_env_response_status) =
        PHP_HTTP_STRLIST_ITEM("No Content")
        PHP_HTTP_STRLIST_ITEM("Reset Content")
        PHP_HTTP_STRLIST_ITEM("Partial Content")
+       PHP_HTTP_STRLIST_ITEM("Multi-Status")
+       PHP_HTTP_STRLIST_ITEM("Already Reported")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("IM Used")
        PHP_HTTP_STRLIST_NEXT
        PHP_HTTP_STRLIST_ITEM("Multiple Choices")
        PHP_HTTP_STRLIST_ITEM("Moved Permanently")
@@ -571,6 +591,7 @@ static PHP_HTTP_STRLIST(php_http_env_response_status) =
        PHP_HTTP_STRLIST_ITEM("Use Proxy")
        PHP_HTTP_STRLIST_ITEM("(Unused)")
        PHP_HTTP_STRLIST_ITEM("Temporary Redirect")
+       PHP_HTTP_STRLIST_ITEM("Permanent Redirect")
        PHP_HTTP_STRLIST_NEXT
        PHP_HTTP_STRLIST_ITEM("Bad Request")
        PHP_HTTP_STRLIST_ITEM("Unauthorized")
@@ -590,6 +611,20 @@ static PHP_HTTP_STRLIST(php_http_env_response_status) =
        PHP_HTTP_STRLIST_ITEM("Unsupported Media Type")
        PHP_HTTP_STRLIST_ITEM("Requested Range Not Satisfiable")
        PHP_HTTP_STRLIST_ITEM("Expectation Failed")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("Unprocessible Entity")
+       PHP_HTTP_STRLIST_ITEM("Locked")
+       PHP_HTTP_STRLIST_ITEM("Failed Dependency")
+       PHP_HTTP_STRLIST_ITEM("(Reserved)")
+       PHP_HTTP_STRLIST_ITEM("Upgrade Required")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("Precondition Required")
+       PHP_HTTP_STRLIST_ITEM("Too Many Requests")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("Request Header Fields Too Large")
        PHP_HTTP_STRLIST_NEXT
        PHP_HTTP_STRLIST_ITEM("Internal Server Error")
        PHP_HTTP_STRLIST_ITEM("Not Implemented")
@@ -597,6 +632,12 @@ static PHP_HTTP_STRLIST(php_http_env_response_status) =
        PHP_HTTP_STRLIST_ITEM("Service Unavailable")
        PHP_HTTP_STRLIST_ITEM("Gateway Timeout")
        PHP_HTTP_STRLIST_ITEM("HTTP Version Not Supported")
+       PHP_HTTP_STRLIST_ITEM("Variant Also Negotiates")
+       PHP_HTTP_STRLIST_ITEM("Insufficient Storage")
+       PHP_HTTP_STRLIST_ITEM("Loop Detected")
+       PHP_HTTP_STRLIST_ITEM("(Unused)")
+       PHP_HTTP_STRLIST_ITEM("Not Extended")
+       PHP_HTTP_STRLIST_ITEM("Network Authentication Required")
        PHP_HTTP_STRLIST_STOP
 ;
 
@@ -605,7 +646,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 +714,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 +769,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 +959,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;