- enable dns data sharing for the global request datashare by default
[m6w6/ext-http] / http_url_api.c
index 60fc11ffb19e086b114a64e10f3a471a2f1cdb0e..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);
@@ -254,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 */
@@ -268,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
@@ -391,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;
                        }
@@ -416,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);