hashtable==zend_array now
[m6w6/ext-http] / php_http_env.c
index a2c3227ea94127d85a2b6b3dfc3bec3dcc8c8d3d..311541d7102ee095f480c8108d1a8e3f33452add 100644 (file)
@@ -37,12 +37,10 @@ PHP_RINIT_FUNCTION(http_env)
                                sapi_post_entry *post_entry = NULL;
 
                                if ((post_entry = zend_hash_find_ptr(&SG(known_post_content_types), key_str))) {
-                                       if (post_entry) {
-                                               SG(request_info).post_entry = post_entry;
+                                       SG(request_info).post_entry = post_entry;
 
-                                               if (post_entry->post_reader) {
-                                                       post_entry->post_reader();
-                                               }
+                                       if (post_entry->post_reader) {
+                                               post_entry->post_reader();
                                        }
 
                                        if (sapi_module.default_post_reader) {
@@ -53,9 +51,12 @@ PHP_RINIT_FUNCTION(http_env)
 
                                        /*
                                         * the rfc1867 handler is an awkward buddy
+                                        * FIXME: this leaks because php_auto_globals_create_files()
+                                        * as well as the rfc1867_handler call
+                                        * array_init(&PG(http_globals)[TRACK_VARS_FILES])
                                         */
                                        Z_TRY_ADDREF(PG(http_globals)[TRACK_VARS_FILES]);
-                                       zend_hash_str_update(&EG(symbol_table).ht, "_FILES", sizeof("_FILES"), &PG(http_globals)[TRACK_VARS_FILES]);
+                                       zend_hash_str_update(&EG(symbol_table), "_FILES", lenof("_FILES"), &PG(http_globals)[TRACK_VARS_FILES]);
                                }
                        }
                        zend_hash_destroy(&params);
@@ -137,7 +138,7 @@ char *php_http_env_get_request_header(const char *name_str, size_t name_len, siz
                request_headers = PHP_HTTP_G->env.request.headers;
        }
 
-       if ((zvalue == zend_symtable_str_find(request_headers, key, name_len))) {
+       if ((zvalue = zend_symtable_str_find(request_headers, key, name_len))) {
                zend_string *zs = zval_get_string(zvalue);
 
                val = estrndup(zs->val, zs->len);
@@ -176,7 +177,7 @@ zval *php_http_env_get_superglobal(const char *key, size_t key_len)
        zend_string *key_str = zend_string_init(key, key_len, 0);
 
        zend_is_auto_global(key_str);
-       hsv = zend_hash_find(&EG(symbol_table).ht, key_str);
+       hsv = zend_hash_find(&EG(symbol_table), key_str);
        zend_string_release(key_str);
 
        if (Z_TYPE_P(hsv) != IS_ARRAY) {
@@ -414,6 +415,9 @@ static void grab_header(void *data, void *arg)
        && !strncmp(header->header, args->name_str, args->name_len)
        ) {
                args->value_ptr = &header->header[args->name_len + 1];
+               while (PHP_HTTP_IS_CTYPE(space, *args->value_ptr)) {
+                       ++args->value_ptr;
+               }
        }
 }
 
@@ -526,7 +530,7 @@ ZEND_RESULT_CODE php_http_env_set_response_header_value(long http_code, const ch
                zval *data_ptr;
                HashTable *ht = HASH_OF(value);
 
-               ZEND_HASH_FOREACH_VAL(ht, data_ptr)
+               ZEND_HASH_FOREACH_VAL_IND(ht, data_ptr)
                {
                        if (SUCCESS != php_http_env_set_response_header_value(http_code, name_str, name_len, data_ptr, first)) {
                                return FAILURE;
@@ -776,15 +780,15 @@ ZEND_END_ARG_INFO();
 static PHP_METHOD(HttpEnv, setResponseHeader)
 {
        char *header_name_str;
-       int header_name_len;
+       size_t header_name_len;
        zval *header_value = NULL;
-       long code = 0;
+       zend_long code = 0;
        zend_bool replace_header = 1;
 
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "s|z!lb", &header_name_str, &header_name_len, &header_value, &code, &replace_header)) {
                return;
        }
-       RETURN_BOOL(SUCCESS == php_http_env_set_response_header_value(code, header_name_str, header_name_len, header_value, replace_header TSRMLS_CC));
+       RETURN_BOOL(SUCCESS == php_http_env_set_response_header_value(code, header_name_str, header_name_len, header_value, replace_header));
 }
 
 ZEND_BEGIN_ARG_INFO_EX(ai_HttpEnv_setResponseCode, 0, 0, 1)
@@ -813,6 +817,7 @@ static PHP_METHOD(HttpEnv, negotiateLanguage)
                return;
        }
        if (rs_array) {
+               ZVAL_DEREF(rs_array);
                zval_dtor(rs_array);
                array_init(rs_array);
        }
@@ -833,6 +838,7 @@ static PHP_METHOD(HttpEnv, negotiateCharset)
                return;
        }
        if (rs_array) {
+               ZVAL_DEREF(rs_array);
                zval_dtor(rs_array);
                array_init(rs_array);
        }
@@ -852,6 +858,7 @@ static PHP_METHOD(HttpEnv, negotiateEncoding)
                return;
        }
        if (rs_array) {
+               ZVAL_DEREF(rs_array);
                zval_dtor(rs_array);
                array_init(rs_array);
        }
@@ -871,6 +878,7 @@ static PHP_METHOD(HttpEnv, negotiateContentType)
                return;
        }
        if (rs_array) {
+               ZVAL_DEREF(rs_array);
                zval_dtor(rs_array);
                array_init(rs_array);
        }
@@ -894,8 +902,8 @@ static PHP_METHOD(HttpEnv, negotiate)
                return;
        }
 
-
        if (rs_array) {
+               ZVAL_DEREF(rs_array);
                zval_dtor(rs_array);
                array_init(rs_array);
        }
@@ -944,14 +952,15 @@ static SAPI_POST_HANDLER_FUNC(php_http_json_post_handler)
 
        if (json) {
                if (json->len) {
-                       zval zjson;
+                       zval tmp;
+
+                       ZVAL_NULL(&tmp);
+                       php_json_decode(&tmp, json->val, json->len, 1, PG(max_input_nesting_level));
 
-                       ZVAL_NULL(&zjson);
-                       php_json_decode(&zjson, json->val, json->len, 1, PG(max_input_nesting_level));
-                       if (Z_TYPE(zjson) != IS_NULL) {
-                               zval_dtor(zarg);
-                               ZVAL_COPY_VALUE(zarg, (&zjson));
+                       if (Z_TYPE(tmp) == IS_ARRAY) {
+                               array_copy(Z_ARRVAL(tmp), Z_ARRVAL_P(zarg));
                        }
+                       zval_ptr_dtor(&tmp);
                }
                zend_string_release(json);
        }