86 lines
2.3 KiB
Plaintext
86 lines
2.3 KiB
Plaintext
--- src/main/http_protocol.c 1998/02/09 01:09:40 1.188
|
|
+++ src/main/http_protocol.c 1998/02/21 01:18:28 1.190
|
|
@@ -625,9 +625,10 @@
|
|
|
|
const char *check_fulluri(request_rec *r, const char *uri)
|
|
{
|
|
- char *name, *host, *proto;
|
|
- int i, plen;
|
|
+ char *host, *proto, *slash, *colon;
|
|
+ int plen;
|
|
unsigned port;
|
|
+ const char *res_uri;
|
|
|
|
/* This routine parses full URLs, if they match the server */
|
|
proto = http_method(r);
|
|
@@ -635,33 +636,49 @@
|
|
|
|
if (strncasecmp(uri, proto, plen) || strncasecmp(uri + plen, "://", 3))
|
|
return uri;
|
|
- name = pstrdup(r->pool, uri + plen);
|
|
+ host = pstrdup(r->pool, uri + plen + 3);
|
|
|
|
/* Find the hostname, assuming a valid request */
|
|
- i = ind(name, '/');
|
|
- name[i] = '\0';
|
|
+ slash = strchr(host, '/');
|
|
+ if (slash) {
|
|
+ *slash = 0;
|
|
+ }
|
|
+ else {
|
|
+ slash = host + strlen(host);
|
|
+ }
|
|
|
|
/* Find the port */
|
|
- host = getword_nc(r->pool, &name, ':');
|
|
- if (*name)
|
|
- port = atoi(name);
|
|
- else
|
|
+ colon = strchr(host, ':');
|
|
+ if (colon) {
|
|
+ *colon = '\0';
|
|
+ port = atoi(colon+1);
|
|
+ if (port == 0) {
|
|
+ return uri;
|
|
+ }
|
|
+ }
|
|
+ else {
|
|
port = default_port(r);
|
|
+ }
|
|
|
|
/* Make sure ports patch */
|
|
if (port != r->server->port)
|
|
return uri;
|
|
|
|
/* Save it for later use */
|
|
- r->hostname = pstrdup(r->pool, host);
|
|
- r->hostlen = plen + 3 + i;
|
|
+ r->hostname = host;
|
|
+ r->hostlen = plen + 3 + slash - host;
|
|
+ res_uri = uri + r->hostlen;
|
|
+ /* deal with "http://host" */
|
|
+ if (*res_uri == '\0') {
|
|
+ res_uri = "/";
|
|
+ }
|
|
|
|
/* The easy cases first */
|
|
if (!strcasecmp(host, r->server->server_hostname)) {
|
|
- return (uri + r->hostlen);
|
|
+ return res_uri;
|
|
}
|
|
else if (!strcmp(host, inet_ntoa(r->connection->local_addr.sin_addr))) {
|
|
- return (uri + r->hostlen);
|
|
+ return res_uri;
|
|
}
|
|
else {
|
|
/* Now things get a bit trickier - check the IP address(es) of
|
|
@@ -674,7 +691,7 @@
|
|
for (n = 0; hp->h_addr_list[n] != NULL; n++) {
|
|
if (r->connection->local_addr.sin_addr.s_addr ==
|
|
(((struct in_addr *) (hp->h_addr_list[n]))->s_addr)) {
|
|
- return (uri + r->hostlen);
|
|
+ return res_uri;
|
|
}
|
|
}
|
|
}
|