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:
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,