X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_url_api.c;h=4f20de5e847c1117d0cec3d4c830606b15f8cdb7;hb=3706c9ddb362d54d409506010952a0129e78e5e9;hp=163dec349de66318ef55d652df0fa951aaccbcaa;hpb=f9d92cff35589f414e369228502c91f35a4e3643;p=m6w6%2Fext-http diff --git a/http_url_api.c b/http_url_api.c index 163dec3..4f20de5 100644 --- a/http_url_api.c +++ b/http_url_api.c @@ -51,13 +51,15 @@ PHP_HTTP_API char *_http_absolute_url_ex( return NULL; } - URL = ecalloc(1, HTTP_URI_MAXLEN + 1); uri = estrndup(url, url_len); if (!(purl = php_url_parse(uri))) { + efree(uri); http_error_ex(HE_WARNING, HTTP_E_URL, "Could not parse supplied URL: %s", url); return NULL; } + URL = ecalloc(1, HTTP_URI_MAXLEN + 1); + furl.user = purl->user; furl.pass = purl->pass; furl.path = purl->path; @@ -69,7 +71,7 @@ PHP_HTTP_API char *_http_absolute_url_ex( } else if (purl->scheme) { furl.scheme = purl->scheme; #if defined(PHP_WIN32) || defined(HAVE_NETDB_H) - } else if (port && (se = getservbyport(htons(port), "tcp"))) { + } else if (port && (se = getservbyport(htons((short) port), "tcp"))) { furl.scheme = (scheme = estrdup(se->s_name)); #endif } else { @@ -80,14 +82,15 @@ PHP_HTTP_API char *_http_absolute_url_ex( furl.port = port; } else if (purl->port) { furl.port = purl->port; - } else if ((!furl.scheme) || strncmp(furl.scheme, "http", 4)) { + } else if (strncmp(furl.scheme, "http", 4)) { #if defined(PHP_WIN32) || defined(HAVE_NETDB_H) if ((se = getservbyname(furl.scheme, "tcp"))) { furl.port = ntohs(se->s_port); } #endif + furl.port = 0; } else { - furl.port = (furl.scheme && furl.scheme[4] == 's') ? 443 : 80; + furl.port = (furl.scheme[4] == 's') ? 443 : 80; } if (host && host_len) { @@ -133,8 +136,13 @@ PHP_HTTP_API char *_http_absolute_url_ex( HTTP_URI_STRLCATL(URL, full_len, furl.host); - if ( (!strcmp(furl.scheme, "http") && (furl.port != 80)) || - (!strcmp(furl.scheme, "https") && (furl.port != 443))) { + if (furl.port && ( + (!strcmp(furl.scheme, "http") && (furl.port != 80)) || + (!strcmp(furl.scheme, "https") && (furl.port != 443)) +#if defined(PHP_WIN32) || defined(HAVE_NETDB_H) + || ((!(se = getservbyname(furl.scheme, "tcp"))) || (ntohs(se->s_port) != furl.port)) +#endif + )) { char port_string[8] = {0}; snprintf(port_string, 7, ":%u", furl.port); HTTP_URI_STRLCATL(URL, full_len, port_string);