- add ob_(deflate|inflate)handler
[m6w6/ext-http] / http_url_api.c
index 99c8af97542d61c164574b404839d39480da9bfc..53faf9506f5417440570c2053df5e9c139011258 100644 (file)
 #include "SAPI.h"
 #include "zend_ini.h"
 #include "php_output.h"
+#include "ext/standard/php_string.h"
 
 #include "php_http_api.h"
 #include "php_http_url_api.h"
 
-ZEND_EXTERN_MODULE_GLOBALS(http);
-
 PHP_HTTP_API char *_http_absolute_url(const char *url TSRMLS_DC)
 {
        char *abs = estrdup(url);
@@ -59,7 +58,6 @@ PHP_HTTP_API void _http_build_url(const php_url *old_url, const php_url *new_url
        __URLCPY(pass);
        __URLCPY(host);
        __URLCPY(path);
-       __URLCPY(path);
        __URLCPY(query);
        __URLCPY(fragment);
        
@@ -100,9 +98,8 @@ PHP_HTTP_API void _http_build_url(const php_url *old_url, const php_url *new_url
                }
        }
        
-       /* FIXXME: dirname(REQUEST_URI) if path is relative */
        if (!url->path) {
-               if (SG(request_info).request_uri) {
+               if (SG(request_info).request_uri && *SG(request_info).request_uri) {
                        const char *q = strchr(SG(request_info).request_uri, '?');
                        
                        if (q) {
@@ -111,7 +108,29 @@ PHP_HTTP_API void _http_build_url(const php_url *old_url, const php_url *new_url
                                url->path = estrdup(SG(request_info).request_uri);
                        }
                } else {
-                       url->path = ecalloc(1, 1);
+                       url->path = estrndup("/", 1);
+               }
+       } else if (*url->path != '/') {
+               if (SG(request_info).request_uri && *SG(request_info).request_uri) {
+                       const char *q = strchr(SG(request_info).request_uri, '?');
+                       char *uri, *path;
+                       size_t len;
+                       
+                       if (q) {
+                               uri = estrndup(SG(request_info).request_uri, len = q - SG(request_info).request_uri);
+                       } else {
+                               uri = estrndup(SG(request_info).request_uri, len = strlen(SG(request_info).request_uri));
+                       }
+                       
+                       php_dirname(uri, len);
+                       spprintf(&path, 0, "%s/%s", uri, url->path);
+                       efree(uri);
+                       STR_SET(url->path, path);
+               } else {
+                       char *uri;
+                       
+                       spprintf(&uri, 0, "/%s", url->path);
+                       STR_SET(url->path, uri);
                }
        }
        
@@ -278,9 +297,13 @@ PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, c
                                return FAILURE;
                        }
                } else {
-                       char *encoded_val;
-                       int encoded_len;
-                       zval *cpy, *val = convert_to_type_ex(IS_STRING, *data, &cpy);
+                       zval *val;
+                       
+                       ALLOC_ZVAL(val);
+                       *val = **data;
+                       INIT_PZVAL(val);
+                       zval_copy_ctor(val);
+                       convert_to_string(val);
                        
                        if (PHPSTR_LEN(str)) {
                                phpstr_append(str, arg_sep, arg_sep_len);
@@ -288,15 +311,17 @@ PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, c
                        phpstr_append(str, PHPSTR_VAL(&new_prefix), PHPSTR_LEN(&new_prefix));
                        phpstr_appends(str, "=");
                        
-                       encoded_val = php_url_encode(Z_STRVAL_P(val), Z_STRLEN_P(val), &encoded_len);
-                       phpstr_append(str, encoded_val, encoded_len);
-                       efree(encoded_val);
-                       
-                       if (cpy) {
-                               zval_ptr_dtor(&cpy);
+                       if (Z_STRLEN_P(val) && Z_STRVAL_P(val)) {
+                               char *encoded_val;
+                               int encoded_len;
+                               
+                               encoded_val = php_url_encode(Z_STRVAL_P(val), Z_STRLEN_P(val), &encoded_len);
+                               phpstr_append(str, encoded_val, encoded_len);
+                               efree(encoded_val);
                        }
+                       
+                       zval_ptr_dtor(&val);
                }
-               
                phpstr_dtor(&new_prefix);
        }
        return SUCCESS;