summaryrefslogtreecommitdiff
path: root/server_file.c
diff options
context:
space:
mode:
authorReyk Floeter <reyk@esdenera.com>2014-07-13 16:12:59 +0200
committerReyk Floeter <reyk@esdenera.com>2014-07-13 16:12:59 +0200
commitb0a1cfbe755d14e21af5e866fc7321cf6a3c8d0b (patch)
tree948585fe33752889c039c67cc1eccd73ec5fa5c8 /server_file.c
parent660b4faa8d41d0817c59d00f8d606daab3586535 (diff)
downloadhttpd-b0a1cfbe755d14e21af5e866fc7321cf6a3c8d0b.tar.gz
httpd-b0a1cfbe755d14e21af5e866fc7321cf6a3c8d0b.zip
Implement media type support
Diffstat (limited to 'server_file.c')
-rw-r--r--server_file.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/server_file.c b/server_file.c
index d9920df..de3be92 100644
--- a/server_file.c
+++ b/server_file.c
@@ -47,11 +47,12 @@
#include "http.h"
int
-server_response(struct client *clt)
+server_response(struct httpd *env, struct client *clt)
{
struct http_descriptor *desc = clt->clt_desc;
struct server *srv = clt->clt_server;
- struct kv *kv;
+ struct kv *ct, *cl;
+ struct media_type *media;
const char *errstr = NULL;
int fd = -1;
char path[MAXPATHLEN];
@@ -90,14 +91,31 @@ server_response(struct client *clt)
if ((fd = open(path, O_RDONLY)) == -1 || fstat(fd, &st) == -1)
goto fail;
- /* XXX verify results XXX */
kv_purge(&desc->http_headers);
- kv_add(&desc->http_headers, "Server", HTTPD_SERVERNAME);
- kv_add(&desc->http_headers, "Connection", "close");
- if ((kv = kv_add(&desc->http_headers, "Content-Length", NULL)) != NULL)
- kv_set(kv, "%ld", st.st_size);
- kv_setkey(&desc->http_pathquery, "200");
- kv_set(&desc->http_pathquery, "%s", server_httperror_byid(200));
+
+ /* 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 ||