diff options
| -rw-r--r-- | lib/http.c | 45 | ||||
| -rw-r--r-- | lib/http.h | 10 | ||||
| -rw-r--r-- | main.c | 12 |
3 files changed, 40 insertions, 27 deletions
@@ -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) { @@ -101,13 +101,18 @@ struct handler_da { size_t cap; }; +typedef struct { + http_middleware *start; + http_middleware *end; +} http_global_middleware; + struct server { size_t sockfd; struct sockaddr *addr; arena *arena; handler_da handlers; context global_ctx; - http_middleware *global_middleware; + http_global_middleware *global_middleware; }; typedef enum { @@ -163,8 +168,9 @@ void http_send_body(struct request req, const_string body); int init_server(arena *arena, struct server *serv, char *addr, char *port); int listen_and_serve(struct server *serv); -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); +void http_register_global_middleware(struct server *hand, http_middleware_func func); void http_register_handler_middleware(arena *arena, handler *hand, http_middleware_func func); #endif // HTTP_H_ @@ -9,7 +9,12 @@ void success(struct request req) { void logging_func(http_middleware *self, struct request req) { (self->next->func)(self->next, req); - http_log(HTTP_INFO, "[1]"CS_FMT" "CS_FMT": %ld\n", CS_ARG(req.method), CS_ARG(req.path), req.resp->code); + http_log(HTTP_INFO, CS_FMT" "CS_FMT": %ld\n", CS_ARG(req.method), CS_ARG(req.path), req.resp->code); +} + +void whatever(http_middleware *self, struct request req) { + http_log(HTTP_INFO, "Whatever"); + (self->next->func)(self->next, req); } int main() { @@ -19,8 +24,9 @@ int main() { return 1; } - handler *success_handler = handle_path(&serv, CS("GET"), CS("/"), success); - http_register_handler_middleware(&arena, success_handler, logging_func); + http_register_global_middleware(&serv, logging_func); + handler *success_handler = http_handle_path(&serv, CS("GET"), CS("/"), success); + http_register_handler_middleware(&arena, success_handler, whatever); listen_and_serve(&serv); |
