#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#include "php.h"
+
+#define HTTP_WANT_NETDB
+#include "php_http.h"
#include "SAPI.h"
#include "zend_ini.h"
#include "php_output.h"
#include "ext/standard/url.h"
-#include "php_http.h"
#include "php_http_api.h"
#include "php_http_url_api.h"
-#include "php_http_std_defs.h"
-
-#include "phpstr/phpstr.h"
-
-#ifdef PHP_WIN32
-# include <winsock2.h>
-#elif defined(HAVE_NETDB_H)
-# include <netdb.h>
-#endif
ZEND_EXTERN_MODULE_GLOBALS(http);
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;
} else if (purl->scheme) {
furl.scheme = purl->scheme;
#if defined(PHP_WIN32) || defined(HAVE_NETDB_H)
- } else if (port && (se = getservbyport(port, "tcp"))) {
+ } else if (port && (se = getservbyport(htons(port), "tcp"))) {
furl.scheme = (scheme = estrdup(se->s_name));
#endif
} else {
furl.port = purl->port;
} else if (strncmp(furl.scheme, "http", 4)) {
#if defined(PHP_WIN32) || defined(HAVE_NETDB_H)
- if (se = getservbyname(furl.scheme, "tcp")) {
- furl.port = se->s_port;
+ if ((se = getservbyname(furl.scheme, "tcp"))) {
+ furl.port = ntohs(se->s_port);
}
#endif
+ furl.port = 0;
} else {
furl.port = (furl.scheme[4] == 's') ? 443 : 80;
}
- if (host) {
+ if (host && host_len) {
furl.host = (char *) host;
} else if (purl->host) {
furl.host = purl->host;
HTTP_URI_STRLCATL(URL, full_len, furl.host);
- if ( (!strcmp(furl.scheme, "http") && (furl.port != 80)) ||
- (!strcmp(furl.scheme, "https") && (furl.port != 443))) {
+ if (( (!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
+ ) && furl.port) {
char port_string[8] = {0};
snprintf(port_string, 7, ":%u", furl.port);
HTTP_URI_STRLCATL(URL, full_len, port_string);