aboutsummaryrefslogtreecommitdiff
path: root/lib/http.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/http.c')
-rw-r--r--lib/http.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/lib/http.c b/lib/http.c
index 1a8ff95..265e79e 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -133,39 +133,37 @@ void http_register_handler_middleware(arena *arena, handler *hand, http_middlewa
middleware->func = func;
middleware->handler = hand->func;
if (hand->middleware == NULL) {
- http_middleware *runner_middleware = arena_alloc(arena, sizeof(http_middleware));
- runner_middleware->func = http_handler_runner_middleware;
- runner_middleware->handler = hand->func;
-
- middleware->next = runner_middleware;
hand->middleware = middleware;
return;
}
- volatile http_middleware *next = hand->middleware;
- while (next->next->next != NULL) {
+ http_middleware **prev = &hand->middleware;
+ http_middleware *next = hand->middleware;
+ while (next->next != NULL) {
+ prev = &next;
next = next->next;
}
- middleware->next = next->next;
- next->next = middleware;
+ middleware->next = next;
+ *prev = middleware;
}
-void http_register_global_middleware(arena *arena, struct server *serv, http_middleware_func func) {
+void http_register_global_middleware(struct server *serv, http_middleware_func func) {
+ arena *arena = serv->arena;
+
http_middleware *middleware = arena_alloc(arena, sizeof(http_middleware));
handler_func *handler = arena_alloc(arena, sizeof(handler_func));
middleware->func = func;
middleware->handler = *handler;
if (serv->global_middleware == NULL) {
- serv->global_middleware = middleware;
+ http_global_middleware *global_middleware = arena_alloc(arena, sizeof(http_global_middleware));
+ global_middleware->start = middleware;
+ global_middleware->end = middleware;
+ serv->global_middleware = global_middleware;
return;
}
- http_middleware *next = serv->global_middleware;
- while (next->next != NULL) {
- next = next->next;
- }
-
- next->next = middleware;
+ serv->global_middleware->end->next = middleware;
+ serv->global_middleware->end = middleware;
}
int init_server(arena *arena, struct server *serv, char *addr, char *port) {
@@ -218,12 +216,13 @@ int init_server(arena *arena, struct server *serv, char *addr, char *port) {
return 0;
}
-handler *handle_path(struct server *serv, const_string method, const_string path, handler_func handler) {
+handler *http_handle_path(struct server *serv, const_string method, const_string path, handler_func handler) {
struct handler hand = {
.method = method,
.path = path,
.func = handler,
};
+ http_register_handler_middleware(serv->arena, &hand, http_handler_runner_middleware);
arena_da_append(serv->arena, &serv->handlers, hand);
return &serv->handlers.data[serv->handlers.len-1];
@@ -498,14 +497,16 @@ void *process_request(void *args) {
set_context_value(&req_arena, &req_context, *(serv.global_ctx.data + i));
}
- if (!resp.code) {
+ if (!resp.sent) {
for (size_t i = 0; i < serv.handlers.len; i++) {
struct handler handler = serv.handlers.data[i];
if (check_handler(handler, req, &req_arena, &req_context)) {
- if (handler.middleware != NULL) {
- handler.middleware->func(handler.middleware, req);
+ if (serv.global_middleware != NULL) {
+ http_global_middleware *g_mid = serv.global_middleware;
+ g_mid->end->next = handler.middleware;
+ g_mid->start->func(g_mid->start, req);
} else {
- handler.func(req);
+ handler.middleware->func(handler.middleware, req);
}
if (!resp.sent) {