bunkum

an old and silly c99 web server with some fun features
Log | Files | Refs | README

commit bae2fdd0adcaa96fd96396eb29ee805b8c36d900
parent 2f6ca9c766f9d7e01fae84de7cc997ea39a872a5
Author: quantumish <freifeld.david@gmail.com>
Date:   Tue, 11 Apr 2023 13:06:02 -0700

Clean up response handling some more

Diffstat:
Mhttp.c | 32+++++++++++++++++++++++---------
Mhttp/response.c | 15+++++++++++++++
Mhttp/response.h | 1+
3 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/http.c b/http.c @@ -38,7 +38,7 @@ response_t serve_file(request_t req) { for (size_t i = 0; read(fd, fbuf+(i*4096), 4096) > 0; i++); char* ext = strchr(req.path, '.'); // NOTE breaks if there's a dir with a dot... - resp_set_ctype(&r, ext); + resp_set_ctype(&r, ext); char datebuf[32]; time_to_str(st.st_mtim.tv_sec, datebuf); @@ -63,6 +63,15 @@ response_t serve_file(request_t req) { return r; } +response_t serve_error(enum StatusCode c) { + response_t r = resp_new(c); + resp_add_hdr(&r, "Content-Type", "text/html"); + char msg[32] = {0}; + sprintf(msg, "<h1>Error %d</h1>", c); + resp_add_content(&r, msg, strlen(msg)); + return r; +} + // TODO actually respect requests // TODO handle gzip // TODO list dirs @@ -78,9 +87,17 @@ void* handle_conn(void* ctxt) { } gettimeofday(&before, NULL); if (msgbuf[0] != 0) { + response_t r; request_t req = req_new(msgbuf, 1024); + int err = req_parse(&req); - if (err < 0) log_error("Failed to parse incoming request."); + if (err < 0) { + log_error("Failed to parse incoming request."); + r = serve_error(BadRequest); + send(ns, r.content, r.sz, 0); + free(r.content); + continue; + } log_debug("Req: %s, %s, %f", method_name(req.method), req.path, req.ver); @@ -97,18 +114,15 @@ void* handle_conn(void* ctxt) { } log_info("Got request for %s", req.path); - + if (shitvec_check(&paths, req.path, (int(*)(void*,void*))strcmp)) { - response_t r = serve_file(req); + r = serve_file(req); send(ns, r.content, r.sz, 0); - free(r.content); } else { - response_t r = __resp_new(NotFound, "Fuck off."); - resp_add_hdr(&r, "Content-Type", "text/html"); - resp_add_content(&r, "Fuck off.", 9); + r = serve_error(NotFound); send(ns, r.content, r.sz, 0); - free(r.content); } + free(r.content); gettimeofday(&after, NULL); timersub(&after, &before, &tdiff); diff --git a/http/response.c b/http/response.c @@ -41,6 +41,21 @@ void resp_add_content(response_t* r, char* content, size_t content_len) { memcpy(r->content+header_len, content, content_len); } +const char* ext_to_mtype(char* ext) { + if (ext == NULL) { + return"text/plain"; + } else if (strcmp(ext+1, "html") == 0) { + return"text/html"; + } else if (strcmp(ext+1, "png") == 0) { + return"image/png"; + } else if (strcmp(ext+1, "svg") == 0) { + return "image/svg+xml"; + } else if (strcmp(ext+1, "jpeg") == 0) { + return "image/jpeg"; + } + +} + void resp_set_ctype(response_t* r, char* ext) { if (ext == NULL) { resp_add_hdr(r, "Content-Type", "text/plain"); diff --git a/http/response.h b/http/response.h @@ -25,6 +25,7 @@ enum StatusCode { NotModified = 304, UseProxy = 305, TemporaryRedirect = 307, + BadRequest = 400, Unauthorized = 401, PaymentRequired = 402, Forbidden = 403,