Redo previous (fixing a memory leak introduced), and while there rework
virtual server support - in daemonized mode mixed virtual and "main" server usage would alter the virtual hostname depending on order of requests. To fix, move the effective virtual hostname into the request structure and leave the httpd server description static.
This commit is contained in:
parent
a8b203cde0
commit
407204a79f
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: bozohttpd.c,v 1.34 2013/06/23 20:32:55 martin Exp $ */
|
||||
/* $NetBSD: bozohttpd.c,v 1.35 2013/06/27 10:01:31 martin Exp $ */
|
||||
|
||||
/* $eterna: bozohttpd.c,v 1.178 2011/11/18 09:21:15 mrg Exp $ */
|
||||
|
||||
@ -337,6 +337,7 @@ bozo_clean_request(bozo_httpreq_t *request)
|
||||
MF(hr_remotehost);
|
||||
MF(hr_remoteaddr);
|
||||
MF(hr_serverport);
|
||||
MF(hr_virthostname);
|
||||
MF(hr_file);
|
||||
MF(hr_oldfile);
|
||||
MF(hr_query);
|
||||
@ -539,6 +540,7 @@ bozo_read_request(bozohttpd_t *httpd)
|
||||
request->hr_range = NULL;
|
||||
request->hr_last_byte_pos = -1;
|
||||
request->hr_if_modified_since = NULL;
|
||||
request->hr_virthostname = NULL;
|
||||
request->hr_file = NULL;
|
||||
request->hr_oldfile = NULL;
|
||||
|
||||
@ -954,6 +956,7 @@ handle_redirect(bozo_httpreq_t *request,
|
||||
bozohttpd_t *httpd = request->hr_httpd;
|
||||
char *urlbuf;
|
||||
char portbuf[20];
|
||||
const char *hostname = BOZOHOST(httpd, request);
|
||||
int query = 0;
|
||||
|
||||
if (url == NULL) {
|
||||
@ -972,7 +975,7 @@ handle_redirect(bozo_httpreq_t *request,
|
||||
request->hr_serverport);
|
||||
else
|
||||
portbuf[0] = '\0';
|
||||
bozo_warn(httpd, "redirecting %s%s%s", httpd->virthostname, portbuf, url);
|
||||
bozo_warn(httpd, "redirecting %s%s%s", hostname, portbuf, url);
|
||||
debug((httpd, DEBUG_FAT, "redirecting %s", url));
|
||||
bozo_printf(httpd, "%s 301 Document Moved\r\n", request->hr_proto);
|
||||
if (request->hr_proto != httpd->consts.http_09)
|
||||
@ -980,7 +983,7 @@ handle_redirect(bozo_httpreq_t *request,
|
||||
if (request->hr_proto != httpd->consts.http_09) {
|
||||
bozo_printf(httpd, "Location: http://");
|
||||
if (absolute == 0)
|
||||
bozo_printf(httpd, "%s%s", httpd->virthostname, portbuf);
|
||||
bozo_printf(httpd, "%s%s", hostname, portbuf);
|
||||
if (query) {
|
||||
bozo_printf(httpd, "%s?%s\r\n", url, request->hr_query);
|
||||
} else {
|
||||
@ -997,13 +1000,13 @@ handle_redirect(bozo_httpreq_t *request,
|
||||
if (absolute)
|
||||
bozo_printf(httpd, "%s?%s", url, request->hr_query);
|
||||
else
|
||||
bozo_printf(httpd, "%s%s%s?%s", httpd->virthostname,
|
||||
bozo_printf(httpd, "%s%s%s?%s", hostname,
|
||||
portbuf, url, request->hr_query);
|
||||
} else {
|
||||
if (absolute)
|
||||
bozo_printf(httpd, "%s", url);
|
||||
else
|
||||
bozo_printf(httpd, "%s%s%s", httpd->virthostname,
|
||||
bozo_printf(httpd, "%s%s%s", hostname,
|
||||
portbuf, url);
|
||||
}
|
||||
bozo_printf(httpd, "\">here</a>\n");
|
||||
@ -1076,9 +1079,10 @@ check_virtual(bozo_httpreq_t *request)
|
||||
len) == 0) {
|
||||
/* found it, punch it */
|
||||
debug((httpd, DEBUG_OBESE, "found it punch it"));
|
||||
httpd->virthostname = strdup(d->d_name);
|
||||
request->hr_virthostname =
|
||||
bozostrdup(httpd,d->d_name);
|
||||
if (asprintf(&s, "%s/%s", httpd->virtbase,
|
||||
httpd->virthostname) < 0)
|
||||
request->hr_virthostname) < 0)
|
||||
bozo_err(httpd, 1, "asprintf");
|
||||
break;
|
||||
}
|
||||
@ -1268,6 +1272,7 @@ transform_request(bozo_httpreq_t *request, int *isindex)
|
||||
bozohttpd_t *httpd = request->hr_httpd;
|
||||
char *file, *newfile = NULL;
|
||||
size_t len;
|
||||
const char *hostname = BOZOHOST(httpd, request);
|
||||
|
||||
file = NULL;
|
||||
*isindex = 0;
|
||||
@ -1306,10 +1311,10 @@ transform_request(bozo_httpreq_t *request, int *isindex)
|
||||
|
||||
debug((httpd, DEBUG_FAT,
|
||||
"checking referrer \"%s\" vs virthostname %s",
|
||||
r, httpd->virthostname));
|
||||
r, hostname));
|
||||
if (strncmp(r, "http://", 7) != 0 ||
|
||||
(strncasecmp(r + 7, httpd->virthostname,
|
||||
strlen(httpd->virthostname)) != 0 &&
|
||||
(strncasecmp(r + 7, hostname,
|
||||
strlen(hostname)) != 0 &&
|
||||
!TOP_PAGE(file)))
|
||||
to_indexhtml = 1;
|
||||
} else {
|
||||
@ -1318,8 +1323,8 @@ transform_request(bozo_httpreq_t *request, int *isindex)
|
||||
debug((httpd, DEBUG_FAT, "url has no referrer at all"));
|
||||
/* if there's no referrer, let / or /index.html past */
|
||||
if (!TOP_PAGE(file) ||
|
||||
(h && strncasecmp(h, httpd->virthostname,
|
||||
strlen(httpd->virthostname)) != 0))
|
||||
(h && strncasecmp(h, hostname,
|
||||
strlen(hostname)) != 0))
|
||||
to_indexhtml = 1;
|
||||
}
|
||||
|
||||
@ -1829,6 +1834,7 @@ bozo_http_error(bozohttpd_t *httpd, int code, bozo_httpreq_t *request,
|
||||
const char *reason = http_errors_long(code);
|
||||
const char *proto = (request && request->hr_proto) ?
|
||||
request->hr_proto : httpd->consts.http_11;
|
||||
const char *hostname = BOZOHOST(httpd, request);
|
||||
int size;
|
||||
|
||||
debug((httpd, DEBUG_FAT, "bozo_http_error %d: %s", code, msg));
|
||||
@ -1855,7 +1861,7 @@ bozo_http_error(bozohttpd_t *httpd, int code, bozo_httpreq_t *request,
|
||||
"<hr><address><a href=\"http://%s%s/\">%s%s</a></address>\n"
|
||||
"</body></html>\n",
|
||||
header, header, request->hr_file, reason,
|
||||
httpd->virthostname, portbuf, httpd->virthostname, portbuf);
|
||||
hostname, portbuf, hostname, portbuf);
|
||||
if (size >= (int)BUFSIZ) {
|
||||
bozo_warn(httpd,
|
||||
"bozo_http_error buffer too small, truncated");
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: bozohttpd.h,v 1.23 2012/07/19 09:53:06 mrg Exp $ */
|
||||
/* $NetBSD: bozohttpd.h,v 1.24 2013/06/27 10:01:31 martin Exp $ */
|
||||
|
||||
/* $eterna: bozohttpd.h,v 1.39 2011/11/18 09:21:15 mrg Exp $ */
|
||||
|
||||
@ -117,6 +117,8 @@ typedef struct bozo_httpreq_t {
|
||||
#define HTTP_TRACE 0x07 /* not supported */
|
||||
#define HTTP_CONNECT 0x08 /* not supported */
|
||||
const char *hr_methodstr;
|
||||
char *hr_virthostname; /* server name (if not identical
|
||||
to hr_httpd->virthostname) */
|
||||
char *hr_file;
|
||||
char *hr_oldfile; /* if we added an index_html */
|
||||
char *hr_query;
|
||||
@ -144,6 +146,11 @@ typedef struct bozo_httpreq_t {
|
||||
int hr_nheaders;
|
||||
} bozo_httpreq_t;
|
||||
|
||||
/* helper to access the "active" host name from a httpd/request pair */
|
||||
#define BOZOHOST(HTTPD,REQUEST) ((REQUEST)->hr_virthostname ? \
|
||||
(REQUEST)->hr_virthostname : \
|
||||
(HTTPD)->virthostname)
|
||||
|
||||
/* structure to hold string based (name, value) pairs with preferences */
|
||||
typedef struct bozoprefs_t {
|
||||
unsigned size; /* size of the two arrays */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cgi-bozo.c,v 1.20 2011/11/18 09:51:31 mrg Exp $ */
|
||||
/* $NetBSD: cgi-bozo.c,v 1.21 2013/06/27 10:01:31 martin Exp $ */
|
||||
|
||||
/* $eterna: cgi-bozo.c,v 1.40 2011/11/18 09:21:15 mrg Exp $ */
|
||||
|
||||
@ -380,7 +380,7 @@ bozo_process_cgi(bozo_httpreq_t *request)
|
||||
|
||||
bozo_setenv(httpd, "PATH", _PATH_DEFPATH, curenvp++);
|
||||
bozo_setenv(httpd, "IFS", " \t\n", curenvp++);
|
||||
bozo_setenv(httpd, "SERVER_NAME", httpd->virthostname, curenvp++);
|
||||
bozo_setenv(httpd, "SERVER_NAME", BOZOHOST(httpd,request), curenvp++);
|
||||
bozo_setenv(httpd, "GATEWAY_INTERFACE", "CGI/1.1", curenvp++);
|
||||
bozo_setenv(httpd, "SERVER_PROTOCOL", request->hr_proto, curenvp++);
|
||||
bozo_setenv(httpd, "REQUEST_METHOD", request->hr_methodstr, curenvp++);
|
||||
|
Loading…
Reference in New Issue
Block a user