bunkum

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

commit eed5ba40afe65162c2af0a9a8e0e1612a447720e
parent 07825c97b36a3820727ddd3a73067dd810830f10
Author: quantumish <freifeld.david@gmail.com>
Date:   Thu, 13 Apr 2023 09:15:12 -0700

Fix Accept header parsing bugs

Diffstat:
Mhttp.c | 9+++++----
Mhttp/request.c | 3++-
Mutils/hashmap.c | 18+++++++++++++-----
Mutils/hashmap.h | 2++
4 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/http.c b/http.c @@ -53,7 +53,7 @@ response_t serve_file(request_t req) { bool ok = true; char* mtype = (char*)ext_to_mtype(ext); - char* hdr; + char* hdr; if ((hdr = hashmap_get(&req.headers, "Accept"))) { log_debug("Handling Accept header"); ok = false; @@ -70,9 +70,9 @@ response_t serve_file(request_t req) { } if (!ok) return serve_error(NotAcceptable); - char datebuf[64]; - time_to_str(st.st_mtim.tv_sec, datebuf); - resp_add_hdr(&r, "Last-Modified", datebuf); + /* char datebuf[64]; */ + /* time_to_str(st.st_mtim.tv_sec, datebuf); */ + /* resp_add_hdr(&r, "Last-Modified", datebuf); */ char* buf = fbuf; // buffer to be written size_t bufsize = st.st_size; @@ -102,6 +102,7 @@ response_t make_response (request_t req) { log_error("Failed to parse incoming request."); return serve_error(BadRequest); } + /* hashmap_dump(&req.headers); */ log_info("Got request %s %s", method_name(req.method), req.path); diff --git a/http/request.c b/http/request.c @@ -73,7 +73,8 @@ int req_parse(request_t* req) { if (name[0] == '\r') return 0; // TODO sketch return -1; // Uhh... half a header. } - hashmap_set(&req->headers, &name, &value); + log_debug("Inserting '%s' (len %d) -> '%s'", name, strlen(name), value); + hashmap_set(&req->headers, name, value); start = memchr(start, '\n', MAX_HEADER_NAME+MAX_HEADER_VALUE)+1; } return 0; diff --git a/utils/hashmap.c b/utils/hashmap.c @@ -50,7 +50,7 @@ hashmap_t hashmap_new(size_t ksize, size_t vsize) { } int hashmap_kcmp(hashmap_t* h, void* a, void* b) { - log_debug("%s %s", a, b); + /* log_debug("%s (%p) vs. %s", a, a, b); */ if (h->vark) return strcmp(a, b); return memcmp(a, b, h->k_sz); } @@ -79,11 +79,19 @@ void hashmap_resize(hashmap_t* h) { free(tempv); } +void hashmap_dump(hashmap_t* h) { + for (size_t off = 0; off < h->len; off+=1) { + char* k = h->keys + (off*h->k_sz); + char* v = h->vals + (off*h->v_sz); + log_debug("'%s' (%p) -> '%s'", k, k, v == NULL ? "NULL" : v); + } +} + int hashmap_set(hashmap_t* h, void* k, void* v) { // Check if load factor too high if ((float)h->filled / h->len > (float)2/3) hashmap_resize(h); - size_t index = hash(k, h->k_sz) % h->len; + size_t index = hash(k, h->vark ? strlen(k) : h->k_sz) % h->len; int looped_once = 0; // Start at the hashed index, iterate until own key or empty key is found for (size_t off = index; off < h->len; off+=1) { @@ -96,7 +104,7 @@ int hashmap_set(hashmap_t* h, void* k, void* v) { if (iszero(h->keys + (off*h->k_sz), h->k_sz)) { h->filled++; memcpy(h->vals + (off*h->v_sz), v, h->v_sz); - hashmap_kcpy(k, h->keys + (off*h->k_sz), k); + hashmap_kcpy(h, h->keys + (off*h->k_sz), k); return 0x0; } if (off == h->len-1 && looped_once == 0) { @@ -110,7 +118,7 @@ int hashmap_set(hashmap_t* h, void* k, void* v) { // Returns address of value if it exists, otherwise returns 0x0 for no value or 0x1 for full table. void* hashmap_get(hashmap_t* h, void* k) { - size_t index = hash(k, h->k_sz) % h->len; + size_t index = hash(k, h->vark ? strlen(k) : h->k_sz) % h->len; int looped_once = 0; // Start at the hashed index, iterate until wanted key or empty key is found for (size_t off = index; off < h->len; off+=1) { @@ -131,7 +139,7 @@ void* hashmap_get(hashmap_t* h, void* k) { } int hashmap_del(hashmap_t* h, void* k) { - size_t index = hash(k, h->k_sz) % h->len; + size_t index = hash(k, h->vark ? strlen(k) : h->k_sz) % h->len; int looped_once = 0; for (size_t off = index; off < h->len; off+=1) { if (hashmap_kcmp(h, h->keys + (off * h->k_sz), k) == 0) { diff --git a/utils/hashmap.h b/utils/hashmap.h @@ -29,4 +29,6 @@ int hashmap_del(hashmap_t* h, void* k); // Frees a hashmap. void hashmap_free(hashmap_t* h); +void hashmap_dump(hashmap_t* h); + #endif