- fix SEGV when there's an exception in HttpRequest::onFinish()
[m6w6/ext-http] / http_url_api.c
index 9068378fcaebb17302cd81504a76139eeb3155dd..37c23cd6910f6b0e2dce4b64095fcc7d28e12f1f 100644 (file)
@@ -161,7 +161,7 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u
        }
        
        if (!url->scheme) {
-               zval *https = http_get_server_var("HTTPS");
+               zval *https = http_get_server_var("HTTPS", 1);
                if (https && !strcasecmp(Z_STRVAL_P(https), "ON")) {
                        url->scheme = estrndup("https", lenof("https"));
                } else switch (url->port) {
@@ -191,8 +191,8 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u
        if (!url->host) {
                zval *zhost;
                
-               if ((((zhost = http_get_server_var("HTTP_HOST")) || 
-                               (zhost = http_get_server_var("SERVER_NAME")))) && Z_STRLEN_P(zhost)) {
+               if ((((zhost = http_get_server_var("HTTP_HOST", 1)) || 
+                               (zhost = http_get_server_var("SERVER_NAME", 1)))) && Z_STRLEN_P(zhost)) {
                        url->host = estrndup(Z_STRVAL_P(zhost), Z_STRLEN_P(zhost));
                } else {
                        url->host = localhostname();
@@ -374,9 +374,7 @@ PHP_HTTP_API STATUS _http_urlencode_hash_ex(HashTable *hash, zend_bool override_
 /* {{{ http_urlencode_hash_recursive */
 PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, const char *arg_sep, size_t arg_sep_len, const char *prefix, size_t prefix_len TSRMLS_DC)
 {
-       char *key = NULL;
-       uint len = 0;
-       ulong idx = 0;
+       HashKey key = initHashKey(0);
        zval **data = NULL;
        HashPosition pos;
 
@@ -388,7 +386,7 @@ PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, c
                return SUCCESS;
        }
        
-       FOREACH_HASH_KEYLENVAL(pos, ht, key, len, idx, data) {
+       FOREACH_HASH_KEYVAL(pos, ht, key, data) {
                char *encoded_key;
                int encoded_len;
                phpstr new_prefix;
@@ -398,18 +396,17 @@ PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, c
                        return FAILURE;
                }
                
-               if (key) {
-                       if (!*key) {
+               if (key.type == HASH_KEY_IS_STRING) {
+                       if (!*key.str) {
                                /* only public properties */
                                continue;
                        }
-                       if (len && key[len - 1] == '\0') {
-                               --len;
+                       if (key.len && key.str[key.len - 1] == '\0') {
+                               --key.len;
                        }
-                       encoded_key = php_url_encode(key, len, &encoded_len);
-                       key = NULL;
+                       encoded_key = php_url_encode(key.str, key.len, &encoded_len);
                } else {
-                       encoded_len = spprintf(&encoded_key, 0, "%ld", idx);
+                       encoded_len = spprintf(&encoded_key, 0, "%ld", key.num);
                }
                
                {