diff options
Diffstat (limited to 'server_file.c')
-rw-r--r-- | server_file.c | 50 |
1 files changed, 13 insertions, 37 deletions
diff --git a/server_file.c b/server_file.c index ff3f565..e8db8a7 100644 --- a/server_file.c +++ b/server_file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server_file.c,v 1.3 2014/07/13 15:07:50 reyk Exp $ */ +/* $OpenBSD: server_file.c,v 1.4 2014/07/14 00:19:48 reyk Exp $ */ /* * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org> @@ -47,20 +47,16 @@ #include "http.h" int -server_response(struct httpd *env, struct client *clt) +server_file(struct httpd *env, struct client *clt) { struct http_descriptor *desc = clt->clt_desc; struct server *srv = clt->clt_server; - struct kv *ct, *cl; struct media_type *media; const char *errstr = NULL; - int fd = -1; + int fd = -1, ret; char path[MAXPATHLEN]; struct stat st; - if (desc->http_path == NULL) - goto fail; - /* * XXX This is not ready XXX * XXX Don't expect anything from this code yet, @@ -91,40 +87,20 @@ server_response(struct httpd *env, struct client *clt) if ((fd = open(path, O_RDONLY)) == -1 || fstat(fd, &st) == -1) goto fail; - kv_purge(&desc->http_headers); - - /* Add error codes */ - if (kv_setkey(&desc->http_pathquery, "200") == -1 || - kv_set(&desc->http_pathquery, "%s", - server_httperror_byid(200)) == -1) - goto fail; - - /* Add headers */ - if (kv_add(&desc->http_headers, "Server", HTTPD_SERVERNAME) == NULL || - kv_add(&desc->http_headers, "Connection", "close") == NULL || - (ct = kv_add(&desc->http_headers, "Content-Type", NULL)) == NULL || - (cl = kv_add(&desc->http_headers, "Content-Length", NULL)) == NULL) - goto fail; - - /* Set content type */ media = media_find(env->sc_mediatypes, path); - if (kv_set(ct, "%s/%s", - media == NULL ? "application" : media->media_type, - media == NULL ? "octet-stream" : media->media_subtype) == -1) - goto fail; - - /* Set content length */ - if (kv_set(cl, "%ld", st.st_size) == -1) - goto fail; - - if (server_writeresponse_http(clt) == -1 || - server_bufferevent_print(clt, "\r\n") == -1 || - server_writeheader_http(clt) == -1 || - server_bufferevent_print(clt, "\r\n") == -1) + ret = server_response_http(clt, 200, media, st.st_size); + switch (ret) { + case -1: goto fail; + case 0: + /* Connection is already finished */ + close(fd); + return (0); + default: + break; + } clt->clt_fd = fd; - clt->clt_persist = 0; if (clt->clt_file != NULL) bufferevent_free(clt->clt_file); clt->clt_file = bufferevent_new(clt->clt_fd, server_read, |