- enable dns data sharing for the global request datashare by default
[m6w6/ext-http] / http_url_api.c
index 65116ae0d4fe7e8028a3cfbe7b3ff570ee56461e..9068378fcaebb17302cd81504a76139eeb3155dd 100644 (file)
@@ -32,10 +32,10 @@ static inline char *localhostname(void)
        if (SUCCESS == gethostname(hostname, lenof(hostname))) {
                return estrdup(hostname);
        }
-#elif defined(HAVE_UNISTD_H)
+#elif defined(HAVE_GETHOSTNAME)
        if (SUCCESS == gethostname(hostname, lenof(hostname))) {
+#      if defined(HAVE_GETDOMAINNAME)
                size_t hlen = strlen(hostname);
-               
                if (hlen <= lenof(hostname) - lenof("(none)")) {
                        hostname[hlen++] = '.';
                        if (SUCCESS == getdomainname(&hostname[hlen], lenof(hostname) - hlen)) {
@@ -45,6 +45,10 @@ static inline char *localhostname(void)
                                return estrdup(hostname);
                        }
                }
+#      endif
+               if (strcmp(hostname, "(none)")) {
+                       return estrdup(hostname);
+               }
        }
 #endif
        return estrdup("localhost");
@@ -92,7 +96,7 @@ PHP_HTTP_API char *_http_absolute_url(const char *url TSRMLS_DC)
 /* {{{ void http_build_url(int flags, const php_url *, const php_url *, php_url **, char **, size_t *) */
 PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_url *new_url, php_url **url_ptr, char **url_str, size_t *url_len TSRMLS_DC)
 {
-#ifdef HTTP_HAVE_NETDB
+#if defined(HAVE_GETSERVBYPORT) || defined(HAVE_GETSERVBYNAME)
        struct servent *se;
 #endif
        php_url *url = ecalloc(1, sizeof(php_url));
@@ -165,14 +169,14 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u
                                url->scheme = estrndup("https", lenof("https"));
                                break;
 
-#ifndef HTTP_HAVE_NETDB
+#ifndef HAVE_GETSERVBYPORT
                        default:
 #endif
                        case 80:
                                url->scheme = estrndup("http", lenof("http"));
                                break;
                        
-#ifdef HTTP_HAVE_NETDB
+#ifdef HAVE_GETSERVBYPORT
                        default:
                                if ((se = getservbyport(htons(url->port), "tcp")) && se->s_name) {
                                        url->scheme = estrdup(se->s_name);
@@ -207,20 +211,29 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u
                } else {
                        url->path = estrndup("/", 1);
                }
-       } else if (url->path[0] != '/' && SG(request_info).request_uri && SG(request_info).request_uri[0]) {
-               size_t ulen = strlen(SG(request_info).request_uri);
-               size_t plen = strlen(url->path);
-               char *path;
-               
-               if (SG(request_info).request_uri[ulen-1] != '/') {
-                       for (--ulen; ulen && SG(request_info).request_uri[ulen - 1] != '/'; --ulen);
+       } else if (url->path[0] != '/') {
+               if (SG(request_info).request_uri && SG(request_info).request_uri[0]) {
+                       size_t ulen = strlen(SG(request_info).request_uri);
+                       size_t plen = strlen(url->path);
+                       char *path;
+                       
+                       if (SG(request_info).request_uri[ulen-1] != '/') {
+                               for (--ulen; ulen && SG(request_info).request_uri[ulen - 1] != '/'; --ulen);
+                       }
+                       
+                       path = emalloc(ulen + plen + 1);
+                       memcpy(path, SG(request_info).request_uri, ulen);
+                       memcpy(path + ulen, url->path, plen);
+                       path[ulen + plen] = '\0';
+                       STR_SET(url->path, path);
+               } else {
+                       size_t plen = strlen(url->path);
+                       char *path = emalloc(plen + 1 + 1);
+                       
+                       path[0] = '/';
+                       memcpy(&path[1], url->path, plen + 1);
+                       STR_SET(url->path, path);
                }
-               
-               path = emalloc(ulen + plen + 1);
-               memcpy(path, SG(request_info).request_uri, ulen);
-               memcpy(path + ulen, url->path, plen);
-               path[ulen + plen] = '\0';
-               STR_SET(url->path, path);
        }
        /* replace directory references if path is not a single slash */
        if (url->path[0] && (url->path[0] != '/' || url->path[1])) {
@@ -245,8 +258,12 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u
                                                        }
                                                }
                                                memmove(&ptr[1], pos, end - pos);
+                                               break;
+                                       } else if (!ptr[3]) {
+                                               /* .. at the end */
+                                               ptr[1] = '\0';
                                        }
-                                       break;
+                                       /* fallthrough */
                                
                                default:
                                        /* something else */
@@ -259,7 +276,7 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u
        if (url->port) {
                if (    ((url->port == 80) && !strcmp(url->scheme, "http"))
                        ||      ((url->port ==443) && !strcmp(url->scheme, "https"))
-#ifdef HTTP_HAVE_NETDB
+#ifdef HAVE_GETSERVBYNAME
                        ||      ((se = getservbyname(url->scheme, "tcp")) && se->s_port && 
                                        (url->port == ntohs(se->s_port)))
 #endif
@@ -296,9 +313,6 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u
                        strlcat(*url_str, port_str, HTTP_URL_MAXLEN);
                }
                
-               if (*url->path != '/') {
-                       strlcat(*url_str, "/", HTTP_URL_MAXLEN);
-               }
                strlcat(*url_str, url->path, HTTP_URL_MAXLEN);
                
                if (url->query && *url->query) {
@@ -385,6 +399,10 @@ PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, c
                }
                
                if (key) {
+                       if (!*key) {
+                               /* only public properties */
+                               continue;
+                       }
                        if (len && key[len - 1] == '\0') {
                                --len;
                        }
@@ -410,10 +428,10 @@ PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, c
                        phpstr_fix(&new_prefix);
                }
                
-               if (Z_TYPE_PP(data) == IS_ARRAY) {
+               if (Z_TYPE_PP(data) == IS_ARRAY || Z_TYPE_PP(data) == IS_OBJECT) {
                        STATUS status;
                        ++ht->nApplyCount;
-                       status = http_urlencode_hash_recursive(Z_ARRVAL_PP(data), str, arg_sep, arg_sep_len, PHPSTR_VAL(&new_prefix), PHPSTR_LEN(&new_prefix));
+                       status = http_urlencode_hash_recursive(HASH_OF(*data), str, arg_sep, arg_sep_len, PHPSTR_VAL(&new_prefix), PHPSTR_LEN(&new_prefix));
                        --ht->nApplyCount;
                        if (SUCCESS != status) {
                                phpstr_dtor(&new_prefix);