aboutsummaryrefslogtreecommitdiff
path: root/server_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'server_file.c')
-rw-r--r--server_file.c50
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,