You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Alexei Kosut <ak...@hyperreal.com> on 1996/06/10 04:04:08 UTC
cvs commit: apache/src http_core.c http_protocol.c http_request.c httpd.h
akosut 96/06/09 19:04:07
Modified: src http_core.c http_protocol.c http_request.c httpd.h
Log:
Add ServerPath directive for use with non IP-based virtual hosts and
compatibility with old HTTP/1.0 clients.
Cause Apache to reject (400 error response) requests that are HTTP/1.1
or later and come without a hostname.
Revision Changes Path
1.17 +15 -1 apache/src/http_core.c
Index: http_core.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_core.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -C3 -r1.16 -r1.17
*** http_core.c 1996/06/08 14:01:36 1.16
--- http_core.c 1996/06/10 02:04:03 1.17
***************
*** 689,694 ****
--- 689,700 ----
return NULL;
}
+ char *set_serverpath (cmd_parms *cmd, void *dummy, char *arg) {
+ cmd->server->path = pstrdup (cmd->pool, arg);
+ cmd->server->pathlen = strlen (arg);
+ return NULL;
+ }
+
char *set_content_md5 (cmd_parms *cmd, core_dir_config *d, int arg) {
d->content_md5 = arg;
return NULL;
***************
*** 822,827 ****
--- 828,835 ----
{ "ServerAlias", set_server_string_slot,
(void *)XtOffsetOf (server_rec, names), RSRC_CONF, RAW_ARGS,
"a name or names alternately used to access the server" },
+ { "ServerPath", set_serverpath, NULL, RSRC_CONF, TAKE1,
+ "The pathname the server can be reached at" },
{ "Timeout", set_timeout, NULL, RSRC_CONF, TAKE1, "timeout duration (sec)"},
{ "KeepAliveTimeout", set_keep_alive_timeout, NULL, RSRC_CONF, TAKE1, "Keep-Alive timeout duration (sec)"},
{ "KeepAlive", set_keep_alive, NULL, RSRC_CONF, TAKE1, "Maximum Keep-Alive requests per connection (0 to disable)" },
***************
*** 857,863 ****
if (r->proxyreq) return NOT_IMPLEMENTED;
if (r->uri[0] != '/') return BAD_REQUEST;
! r->filename = pstrcat (r->pool, conf->document_root, r->uri, NULL);
return OK;
}
--- 865,877 ----
if (r->proxyreq) return NOT_IMPLEMENTED;
if (r->uri[0] != '/') return BAD_REQUEST;
! if (r->server->path &&
! !strncmp(r->uri, r->server->path, r->server->pathlen))
! r->filename = pstrcat (r->pool, conf->document_root,
! (r->uri + r->server->pathlen), NULL);
! else
! r->filename = pstrcat (r->pool, conf->document_root, r->uri, NULL);
!
return OK;
}
1.22 +20 -0 apache/src/http_protocol.c
Index: http_protocol.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_protocol.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -C3 -r1.21 -r1.22
*** http_protocol.c 1996/06/07 20:18:59 1.21
--- http_protocol.c 1996/06/10 02:04:04 1.22
***************
*** 310,315 ****
--- 310,316 ----
char l[HUGE_STRING_LEN];
char *ll = l, *uri;
conn_rec *conn = r->connection;
+ int major = 1, minor = 0; /* Assume HTTP/1.0 if non-"HTTP" protocol*/
l[0] = '\0';
if(!getline(l, HUGE_STRING_LEN, conn->client))
***************
*** 325,330 ****
--- 326,334 ----
r->assbackwards = (ll[0] == '\0');
r->protocol = ll[0] ? pstrdup (r->pool, ll) : "HTTP/0.9";
+ sscanf(r->protocol, "HTTP/%d.%d", &major, &minor);
+ r->proto_num = 1000*major + minor;
+
return 1;
}
***************
*** 387,392 ****
--- 391,410 ----
}
}
+ void check_serverpath (request_rec *r) {
+ server_rec *s;
+
+ /* This is in conjunction with the ServerPath code in
+ * http_core, so we get the right host attached to a non-
+ * Host-sending request.
+ */
+
+ for (s = r->server->next; s; s = s->next) {
+ if (s->path && !strncmp(r->uri, s->path, s->pathlen))
+ r->server = r->connection->server = s;
+ }
+ }
+
request_rec *read_request (conn_rec *conn)
{
request_rec *r = (request_rec *)pcalloc (conn->pool, sizeof(request_rec));
***************
*** 427,432 ****
--- 445,452 ----
if (r->hostname || (r->hostname = table_get(r->headers_in, "Host")))
check_hostalias(r);
+ else
+ check_serverpath(r);
kill_timeout (r);
conn->keptalive = 0; /* We now have a request - so no more short timeouts */
1.8 +11 -0 apache/src/http_request.c
Index: http_request.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_request.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C3 -r1.7 -r1.8
*** http_request.c 1996/05/22 17:35:37 1.7
--- http_request.c 1996/06/10 02:04:04 1.8
***************
*** 678,683 ****
--- 678,694 ----
return;
}
+ if (!r->hostname && (r->proto_num >= 1001)) {
+ /* Client sent us a HTTP/1.1 or later request without telling
+ * us the hostname, either with a full URL or a Host: header.
+ * We therefore need to (as per the 1.1 spec) send an error
+ */
+ log_reason ("client sent HTTP/1.1 request without hostname",
+ r->uri, r);
+ die (BAD_REQUEST, r);
+ return;
+ }
+
if (!r->proxyreq)
{
access_status = unescape_url(r->uri);
1.27 +4 -0 apache/src/httpd.h
Index: httpd.h
===================================================================
RCS file: /export/home/cvs/apache/src/httpd.h,v
retrieving revision 1.26
retrieving revision 1.27
diff -C3 -r1.26 -r1.27
*** httpd.h 1996/06/07 20:19:00 1.26
--- httpd.h 1996/06/10 02:04:04 1.27
***************
*** 338,343 ****
--- 338,344 ----
int proxyreq; /* A proxy request */
int header_only; /* HEAD request, as opposed to GET */
char *protocol; /* Protocol, as given to us, or HTTP/0.9 */
+ int proto_num; /* Number version of protocol; 1.1 = 1001 */
char *hostname; /* Host, as set by full URI or Host: */
int hostlen; /* Length of http://host:port in full URI */
***************
*** 484,489 ****
--- 485,493 ----
int timeout; /* Timeout, in seconds, before we give up */
int keep_alive_timeout; /* Seconds we'll wait for another request */
int keep_alive; /* Maximum requests per connection */
+
+ char *path; /* Pathname for ServerPath */
+ int pathlen; /* Length of path */
char *names; /* Wildcarded names for HostAlias servers */
char *virthost; /* The name given in <VirtualHost> */