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