- split off query strin API and use it in
[m6w6/ext-http] / http_url_api.c
index cb0aeb5bd05d0eabcbfd018d71a4c30402d8e1ff..1ccd4dba72a529f92929d8016bc735a63d3d0051 100644 (file)
@@ -21,6 +21,7 @@
 #include "ext/standard/php_string.h"
 
 #include "php_http_api.h"
+#include "php_http_querystring_api.h"
 #include "php_http_url_api.h"
 
 static inline char *localhostname(void)
@@ -66,16 +67,22 @@ PHP_MINIT_FUNCTION(http_url)
 
 PHP_HTTP_API char *_http_absolute_url(const char *url TSRMLS_DC)
 {
-       char *abs = estrdup(url);
-       php_url *purl = php_url_parse(abs);
+       char *abs = NULL;
+       php_url *purl = NULL;
        
-       STR_SET(abs, NULL);
+       if (url) {
+               purl = php_url_parse(abs = estrdup(url));
+               STR_SET(abs, NULL);
+               if (!purl) {
+                       http_error_ex(HE_WARNING, HTTP_E_URL, "Could not parse URL (%s)", url);
+                       return NULL;
+               }
+       }
+       
+       http_build_url(0, purl, NULL, NULL, &abs, NULL);
        
        if (purl) {
-               http_build_url(0, purl, NULL, NULL, &abs, NULL);
                php_url_free(purl);
-       } else {
-               http_error_ex(HE_WARNING, HTTP_E_URL, "Could not parse URL (%s)", url);
        }
        
        return abs;
@@ -125,10 +132,21 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u
        }
        if (!(flags & HTTP_URL_STRIP_QUERY)) {
                if ((flags & HTTP_URL_JOIN_QUERY) && __URLSET(new_url, query) && __URLSET(old_url, query)) {
-                       url->query = ecalloc(1, strlen(new_url->query) + strlen(old_url->query) + 1 + 1);
-                       strcat(url->query, old_url->query);
-                       strcat(url->query, "&");
-                       strcat(url->query, new_url->query);
+                       zval qarr, qstr;
+                       
+                       INIT_PZVAL(&qstr);
+                       INIT_PZVAL(&qarr);
+                       array_init(&qarr);
+                       
+                       ZVAL_STRING(&qstr, old_url->query, 0);
+                       http_querystring_modify(&qarr, &qstr);
+                       ZVAL_STRING(&qstr, new_url->query, 0);
+                       http_querystring_modify(&qarr, &qstr);
+                       
+                       ZVAL_NULL(&qstr);
+                       http_querystring_update(&qarr, &qstr);
+                       url->query = Z_STRVAL(qstr);
+                       zval_dtor(&qarr);
                } else {
                        __URLCPY(query);
                }