diff options
author | 2014-08-29 13:01:46 +0000 | |
---|---|---|
committer | 2014-08-29 13:01:46 +0000 | |
commit | d08e49762f6043725e511256b27277e1efeaa735 (patch) | |
tree | 7cf09da7ac0381487cdc7816c86a46d4f3673625 | |
parent | mount_mfs does not require disklabel to be run; (diff) | |
download | wireguard-openbsd-d08e49762f6043725e511256b27277e1efeaa735.tar.xz wireguard-openbsd-d08e49762f6043725e511256b27277e1efeaa735.zip |
Use two instead of one http descriptor for request and response.
OK chrisz@
-rw-r--r-- | usr.sbin/httpd/httpd.h | 7 | ||||
-rw-r--r-- | usr.sbin/httpd/server_fcgi.c | 25 | ||||
-rw-r--r-- | usr.sbin/httpd/server_file.c | 10 | ||||
-rw-r--r-- | usr.sbin/httpd/server_http.c | 78 |
4 files changed, 69 insertions, 51 deletions
diff --git a/usr.sbin/httpd/httpd.h b/usr.sbin/httpd/httpd.h index 6f1b48d95c8..04b1f052309 100644 --- a/usr.sbin/httpd/httpd.h +++ b/usr.sbin/httpd/httpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: httpd.h,v 1.54 2014/08/21 19:23:10 chrisz Exp $ */ +/* $OpenBSD: httpd.h,v 1.55 2014/08/29 13:01:46 reyk Exp $ */ /* * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org> @@ -276,7 +276,8 @@ struct client { size_t clt_buflen; struct evbuffer *clt_output; struct event clt_ev; - void *clt_desc; + void *clt_descreq; + void *clt_descresp; int clt_sndbufsiz; int clt_fd; @@ -508,7 +509,7 @@ const char void server_read_httpcontent(struct bufferevent *, void *); void server_read_httpchunks(struct bufferevent *, void *); int server_writeheader_http(struct client *clt, struct kv *, void *); -int server_headers(struct client *, +int server_headers(struct client *, void *, int (*)(struct client *, struct kv *, void *), void *); int server_writeresponse_http(struct client *); int server_response_http(struct client *, u_int, struct media_type *, diff --git a/usr.sbin/httpd/server_fcgi.c b/usr.sbin/httpd/server_fcgi.c index 6eb668ea72f..fe97be040cb 100644 --- a/usr.sbin/httpd/server_fcgi.c +++ b/usr.sbin/httpd/server_fcgi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server_fcgi.c,v 1.34 2014/08/21 19:23:10 chrisz Exp $ */ +/* $OpenBSD: server_fcgi.c,v 1.35 2014/08/29 13:01:46 reyk Exp $ */ /* * Copyright (c) 2014 Florian Obser <florian@openbsd.org> @@ -96,7 +96,7 @@ server_fcgi(struct httpd *env, struct client *clt) { struct server_fcgi_param param; struct server_config *srv_conf = clt->clt_srv_conf; - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc = clt->clt_descreq; struct fcgi_record_header *h; struct fcgi_begin_request_body *begin; char hbuf[MAXHOSTNAMELEN]; @@ -249,7 +249,7 @@ server_fcgi(struct httpd *env, struct client *clt) } /* Add HTTP_* headers */ - if (server_headers(clt, server_fcgi_writeheader, ¶m) == -1) { + if (server_headers(clt, desc, server_fcgi_writeheader, ¶m) == -1) { errstr = "failed to encode param"; goto fail; } @@ -533,7 +533,8 @@ server_fcgi_read(struct bufferevent *bev, void *arg) int server_fcgi_header(struct client *clt, u_int code) { - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc = clt->clt_descreq; + struct http_descriptor *resp = clt->clt_descresp; const char *error; char tmbuf[32]; @@ -543,34 +544,32 @@ server_fcgi_header(struct client *clt, u_int code) if (server_log_http(clt, code, 0) == -1) return (-1); - kv_purge(&desc->http_headers); - /* Add error codes */ - if (kv_setkey(&desc->http_pathquery, "%lu", code) == -1 || - kv_set(&desc->http_pathquery, "%s", error) == -1) + if (kv_setkey(&resp->http_pathquery, "%lu", code) == -1 || + kv_set(&resp->http_pathquery, "%s", error) == -1) return (-1); /* Add headers */ - if (kv_add(&desc->http_headers, "Server", HTTPD_SERVERNAME) == NULL) + if (kv_add(&resp->http_headers, "Server", HTTPD_SERVERNAME) == NULL) return (-1); /* Is it a persistent connection? */ if (clt->clt_persist) { - if (kv_add(&desc->http_headers, + if (kv_add(&resp->http_headers, "Connection", "keep-alive") == NULL) return (-1); - } else if (kv_add(&desc->http_headers, "Connection", "close") == NULL) + } else if (kv_add(&resp->http_headers, "Connection", "close") == NULL) return (-1); /* Date header is mandatory and should be added as late as possible */ if (server_http_time(time(NULL), tmbuf, sizeof(tmbuf)) <= 0 || - kv_add(&desc->http_headers, "Date", tmbuf) == NULL) + kv_add(&resp->http_headers, "Date", tmbuf) == NULL) return (-1); /* Write initial header (fcgi might append more) */ if (server_writeresponse_http(clt) == -1 || server_bufferevent_print(clt, "\r\n") == -1 || - server_headers(clt, server_writeheader_http, NULL) == -1) + server_headers(clt, resp, server_writeheader_http, NULL) == -1) return (-1); return (0); diff --git a/usr.sbin/httpd/server_file.c b/usr.sbin/httpd/server_file.c index 28b17c7273d..e8a487ec325 100644 --- a/usr.sbin/httpd/server_file.c +++ b/usr.sbin/httpd/server_file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server_file.c,v 1.34 2014/08/21 19:23:10 chrisz Exp $ */ +/* $OpenBSD: server_file.c,v 1.35 2014/08/29 13:01:46 reyk Exp $ */ /* * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org> @@ -56,7 +56,7 @@ int server_file_access(struct httpd *env, struct client *clt, char *path, size_t len) { - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc = clt->clt_descreq; struct server_config *srv_conf = clt->clt_srv_conf; struct stat st; char *newpath; @@ -150,7 +150,7 @@ server_file_access(struct httpd *env, struct client *clt, int server_file(struct httpd *env, struct client *clt) { - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc = clt->clt_descreq; struct server_config *srv_conf = clt->clt_srv_conf; char path[MAXPATHLEN]; const char *errstr = NULL; @@ -187,7 +187,7 @@ server_file(struct httpd *env, struct client *clt) int server_file_method(struct client *clt) { - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc = clt->clt_descreq; switch (desc->http_method) { case HTTP_METHOD_GET: @@ -272,7 +272,7 @@ server_file_index(struct httpd *env, struct client *clt, struct stat *st) { char path[MAXPATHLEN]; char tmstr[21]; - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc = clt->clt_descreq; struct server_config *srv_conf = clt->clt_srv_conf; struct dirent **namelist, *dp; int namesize, i, ret, fd = -1, namewidth, skip; diff --git a/usr.sbin/httpd/server_http.c b/usr.sbin/httpd/server_http.c index af996a5c4d6..3d7abc7fb62 100644 --- a/usr.sbin/httpd/server_http.c +++ b/usr.sbin/httpd/server_http.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server_http.c,v 1.45 2014/08/21 19:23:10 chrisz Exp $ */ +/* $OpenBSD: server_http.c,v 1.46 2014/08/29 13:01:46 reyk Exp $ */ /* * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org> @@ -86,9 +86,15 @@ server_httpdesc_init(struct client *clt) if ((desc = calloc(1, sizeof(*desc))) == NULL) return (-1); + RB_INIT(&desc->http_headers); + clt->clt_descreq = desc; + if ((desc = calloc(1, sizeof(*desc))) == NULL) { + /* req will be cleaned up later */ + return (-1); + } RB_INIT(&desc->http_headers); - clt->clt_desc = desc; + clt->clt_descresp = desc; return (0); } @@ -96,6 +102,8 @@ server_httpdesc_init(struct client *clt) void server_httpdesc_free(struct http_descriptor *desc) { + if (desc == NULL) + return; if (desc->http_path != NULL) { free(desc->http_path); desc->http_path = NULL; @@ -118,6 +126,8 @@ server_httpdesc_free(struct http_descriptor *desc) } kv_purge(&desc->http_headers); desc->http_lastheader = NULL; + desc->http_method = 0; + desc->http_chunked = 0; } void @@ -125,7 +135,7 @@ server_read_http(struct bufferevent *bev, void *arg) { struct client *clt = arg; struct server_config *srv_conf = clt->clt_srv_conf; - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc = clt->clt_descreq; struct evbuffer *src = EVBUFFER_INPUT(bev); char *line = NULL, *key, *value; const char *errstr; @@ -518,12 +528,10 @@ server_read_httpchunks(struct bufferevent *bev, void *arg) void server_reset_http(struct client *clt) { - struct http_descriptor *desc = clt->clt_desc; struct server *srv = clt->clt_srv; - - server_httpdesc_free(desc); - desc->http_method = 0; - desc->http_chunked = 0; + + server_httpdesc_free(clt->clt_descreq); + server_httpdesc_free(clt->clt_descresp); clt->clt_headerlen = 0; clt->clt_line = 0; clt->clt_done = 0; @@ -670,12 +678,17 @@ server_abort_http(struct client *clt, u_int code, const char *msg) void server_close_http(struct client *clt) { - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc; - if (desc == NULL) - return; + desc = clt->clt_descreq; + server_httpdesc_free(desc); + free(desc); + clt->clt_descreq = NULL; + + desc = clt->clt_descresp; server_httpdesc_free(desc); free(desc); + clt->clt_descresp = NULL; } int @@ -683,7 +696,8 @@ server_response(struct httpd *httpd, struct client *clt) { char path[MAXPATHLEN]; char hostname[MAXHOSTNAMELEN]; - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc = clt->clt_descreq; + struct http_descriptor *resp = clt->clt_descresp; struct server *srv = clt->clt_srv; struct server_config *srv_conf = &srv->srv_conf; struct kv *kv, key, *host; @@ -760,6 +774,11 @@ server_response(struct httpd *httpd, struct client *clt) if ((desc->http_host = strdup(hostname)) == NULL) goto fail; + /* Now fill in the mandatory parts of the response descriptor */ + resp->http_method = desc->http_method; + if ((resp->http_version = strdup(desc->http_version)) == NULL) + goto fail; + /* Now search for the location */ srv_conf = server_getlocation(clt, desc->http_path); @@ -793,7 +812,8 @@ int server_response_http(struct client *clt, u_int code, struct media_type *media, size_t size, time_t mtime) { - struct http_descriptor *desc = clt->clt_desc; + struct http_descriptor *desc = clt->clt_descreq; + struct http_descriptor *resp = clt->clt_descresp; const char *error; struct kv *ct, *cl; char tmbuf[32]; @@ -804,27 +824,25 @@ server_response_http(struct client *clt, u_int code, if (server_log_http(clt, code, size) == -1) return (-1); - kv_purge(&desc->http_headers); - /* Add error codes */ - if (kv_setkey(&desc->http_pathquery, "%lu", code) == -1 || - kv_set(&desc->http_pathquery, "%s", error) == -1) + if (kv_setkey(&resp->http_pathquery, "%lu", code) == -1 || + kv_set(&resp->http_pathquery, "%s", error) == -1) return (-1); /* Add headers */ - if (kv_add(&desc->http_headers, "Server", HTTPD_SERVERNAME) == NULL) + if (kv_add(&resp->http_headers, "Server", HTTPD_SERVERNAME) == NULL) return (-1); /* Is it a persistent connection? */ if (clt->clt_persist) { - if (kv_add(&desc->http_headers, + if (kv_add(&resp->http_headers, "Connection", "keep-alive") == NULL) return (-1); - } else if (kv_add(&desc->http_headers, "Connection", "close") == NULL) + } else if (kv_add(&resp->http_headers, "Connection", "close") == NULL) return (-1); /* Set media type */ - if ((ct = kv_add(&desc->http_headers, "Content-Type", NULL)) == NULL || + if ((ct = kv_add(&resp->http_headers, "Content-Type", NULL)) == NULL || kv_set(ct, "%s/%s", media == NULL ? "application" : media->media_type, media == NULL ? "octet-stream" : media->media_subtype) == -1) @@ -832,28 +850,28 @@ server_response_http(struct client *clt, u_int code, /* Set content length, if specified */ if ((cl = - kv_add(&desc->http_headers, "Content-Length", NULL)) == NULL || + kv_add(&resp->http_headers, "Content-Length", NULL)) == NULL || kv_set(cl, "%ld", size) == -1) return (-1); /* Set last modification time */ if (server_http_time(mtime, tmbuf, sizeof(tmbuf)) <= 0 || - kv_add(&desc->http_headers, "Last-Modified", tmbuf) == NULL) + kv_add(&resp->http_headers, "Last-Modified", tmbuf) == NULL) return (-1); /* Date header is mandatory and should be added as late as possible */ if (server_http_time(time(NULL), tmbuf, sizeof(tmbuf)) <= 0 || - kv_add(&desc->http_headers, "Date", tmbuf) == NULL) + kv_add(&resp->http_headers, "Date", tmbuf) == NULL) return (-1); /* Write completed header */ if (server_writeresponse_http(clt) == -1 || server_bufferevent_print(clt, "\r\n") == -1 || - server_headers(clt, server_writeheader_http, NULL) == -1 || + server_headers(clt, resp, server_writeheader_http, NULL) == -1 || server_bufferevent_print(clt, "\r\n") == -1) return (-1); - if (size == 0 || desc->http_method == HTTP_METHOD_HEAD) { + if (size == 0 || resp->http_method == HTTP_METHOD_HEAD) { bufferevent_enable(clt->clt_bev, EV_READ|EV_WRITE); if (clt->clt_persist) clt->clt_toread = TOREAD_HTTP_HEADER; @@ -869,7 +887,7 @@ server_response_http(struct client *clt, u_int code, int server_writeresponse_http(struct client *clt) { - struct http_descriptor *desc = (struct http_descriptor *)clt->clt_desc; + struct http_descriptor *desc = clt->clt_descresp; DPRINTF("version: %s rescode: %s resmsg: %s", desc->http_version, desc->http_rescode, desc->http_resmesg); @@ -913,11 +931,11 @@ server_writeheader_http(struct client *clt, struct kv *hdr, void *arg) } int -server_headers(struct client *clt, +server_headers(struct client *clt, void *descp, int (*hdr_cb)(struct client *, struct kv *, void *), void *arg) { struct kv *hdr, *kv; - struct http_descriptor *desc = (struct http_descriptor *)clt->clt_desc; + struct http_descriptor *desc = descp; RB_FOREACH(hdr, kvtree, &desc->http_headers) { if ((hdr_cb)(clt, hdr, arg) == -1) @@ -1015,7 +1033,7 @@ server_log_http(struct client *clt, u_int code, size_t len) return (-1); if ((srv_conf->flags & SRVFLAG_LOG) == 0) return (0); - if ((desc = clt->clt_desc) == NULL) + if ((desc = clt->clt_descreq) == NULL) return (-1); if ((t = time(NULL)) == -1) |