X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_url_api.c;h=bdda91161088340f01a72cf38738f41eae50d5db;hp=dff4caec0a78d6e73483ea9669d3c0f3b458183c;hb=e37040ebf8a470c77c7ae3498ee582ca20db259c;hpb=d046681a7b929ef813849cfe38fbceb333f0b0eb diff --git a/http_url_api.c b/http_url_api.c index dff4cae..bdda911 100644 --- a/http_url_api.c +++ b/http_url_api.c @@ -23,6 +23,32 @@ #include "php_http_api.h" #include "php_http_url_api.h" +static inline char *localhostname(void) +{ + char hostname[1024] = {0}; + +#ifdef PHP_WIN32 + if (SUCCESS == gethostname(hostname, lenof(hostname))) { + return estrdup(hostname); + } +#elif defined(HAVE_UNISTD_H) + if (SUCCESS == gethostname(hostname, lenof(hostname))) { + size_t hlen = strlen(hostname); + + if (hlen <= lenof(hostname) - lenof("(none)")) { + hostname[hlen++] = '.'; + if (SUCCESS == getdomainname(&hostname[hlen], lenof(hostname) - hlen)) { + if (!strcmp(&hostname[hlen], "(none)")) { + hostname[hlen - 1] = '\0'; + } + return estrdup(hostname); + } + } + } +#endif + return estrdup("localhost"); +} + PHP_MINIT_FUNCTION(http_url) { HTTP_LONG_CONSTANT("HTTP_URL_REPLACE", HTTP_URL_REPLACE); @@ -40,16 +66,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; + + 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; + } + } - STR_SET(abs, 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; @@ -144,7 +176,7 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u (zhost = http_get_server_var("SERVER_NAME")))) && Z_STRLEN_P(zhost)) { url->host = estrndup(Z_STRVAL_P(zhost), Z_STRLEN_P(zhost)); } else { - url->host = estrndup("localhost", lenof("localhost")); + url->host = localhostname(); } } @@ -208,6 +240,11 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u memmove(&ptr[1], pos, end - pos); } break; + + default: + /* something else */ + ++ptr; + break; } } } @@ -245,9 +282,9 @@ PHP_HTTP_API void _http_build_url(int flags, const php_url *old_url, const php_u strlcat(*url_str, url->host, HTTP_URL_MAXLEN); if (url->port) { - char port_str[6] = {0}; + char port_str[8] = {0}; - snprintf(port_str, 5, "%d", (int) url->port); + snprintf(port_str, lenof(port_str), "%d", (int) url->port); strlcat(*url_str, ":", HTTP_URL_MAXLEN); strlcat(*url_str, port_str, HTTP_URL_MAXLEN); } @@ -336,6 +373,7 @@ PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, c phpstr new_prefix; if (!data || !*data) { + phpstr_dtor(str); return FAILURE; } @@ -353,14 +391,14 @@ PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, c phpstr_init(&new_prefix); if (prefix && prefix_len) { phpstr_append(&new_prefix, prefix, prefix_len); - phpstr_appends(&new_prefix, "["); + phpstr_appends(&new_prefix, "%5B"); } phpstr_append(&new_prefix, encoded_key, encoded_len); efree(encoded_key); if (prefix && prefix_len) { - phpstr_appends(&new_prefix, "]"); + phpstr_appends(&new_prefix, "%5D"); } phpstr_fix(&new_prefix); } @@ -372,6 +410,7 @@ PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, c --ht->nApplyCount; if (SUCCESS != status) { phpstr_dtor(&new_prefix); + phpstr_dtor(str); return FAILURE; } } else {