From 9fa009ccf4d308aeca3323c151d26e6edcb41769 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Fri, 23 Feb 2024 15:21:23 +0100 Subject: [PATCH] feat: provide access to key segments from step --- example/routing.c | 44 ++++++++++++++++++++++++++++++++ include/lnm/http/loop.h | 2 +- src/http/lnm_http_loop_ctx.c | 1 - src/http/lnm_http_loop_process.c | 7 ++--- src/http/lnm_http_router.c | 6 ++--- test/routing.c | 2 +- 6 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 example/routing.c diff --git a/example/routing.c b/example/routing.c new file mode 100644 index 0000000..47d02b3 --- /dev/null +++ b/example/routing.c @@ -0,0 +1,44 @@ +#include + +#include "lnm/log.h" +#include "lnm/loop.h" +#include "lnm/http/loop.h" + +lnm_err ctx_init(void **c_ctx, void *gctx) { + *c_ctx = NULL; + + return lnm_err_ok; +} + +void ctx_reset(void *c_ctx) {} +void ctx_free(void *c_ctx) {} + +lnm_http_step_err print_step(lnm_http_conn *conn) { + lnm_http_loop_ctx *ctx = conn->ctx; + + const lnm_http_route_match_segment *seg = lnm_http_route_match_get(&ctx->match, "key"); + lnm_linfo("main", "key: %.*s", seg->len, ctx->req.buf.s + ctx->req.path.o + seg->start); + return lnm_http_step_err_done; +} + +int main() { + lnm_http_loop *hl; + + lnm_http_loop_init(&hl, NULL, ctx_init, + ctx_reset, + ctx_free); + + lnm_http_router *router; + lnm_http_router_init(&router); + + lnm_http_route *route; + lnm_http_router_add(&route, router, lnm_http_method_get, "/:key"); + lnm_http_route_step_append(route, print_step, false); + + lnm_http_loop_router_set(hl, router); + + lnm_log_init_global(); + lnm_log_register_stdout(lnm_log_level_debug); + + printf("res = %i\n", lnm_http_loop_run(hl, 8080, 1, 0)); +} diff --git a/include/lnm/http/loop.h b/include/lnm/http/loop.h index 892723a..3731f34 100644 --- a/include/lnm/http/loop.h +++ b/include/lnm/http/loop.h @@ -130,7 +130,7 @@ typedef struct lnm_http_loop_ctx { lnm_http_loop_state state; lnm_http_req req; lnm_http_res res; - const lnm_http_route *route; + lnm_http_route_match match; lnm_http_step *cur_step; lnm_http_loop_gctx *g; void *c; diff --git a/src/http/lnm_http_loop_ctx.c b/src/http/lnm_http_loop_ctx.c index 87741e2..848fe86 100644 --- a/src/http/lnm_http_loop_ctx.c +++ b/src/http/lnm_http_loop_ctx.c @@ -42,7 +42,6 @@ void lnm_http_loop_ctx_reset(lnm_http_loop_ctx *ctx) { lnm_http_req_reset(&ctx->req); lnm_http_res_reset(&ctx->res); - ctx->route = NULL; ctx->cur_step = NULL; } diff --git a/src/http/lnm_http_loop_process.c b/src/http/lnm_http_loop_process.c index e6a405e..91b9254 100644 --- a/src/http/lnm_http_loop_process.c +++ b/src/http/lnm_http_loop_process.c @@ -58,13 +58,10 @@ void lnm_http_loop_process_route(lnm_http_conn *conn) { lnm_http_loop_ctx *ctx = conn->ctx; const lnm_http_loop_gctx *gctx = ctx->g; - lnm_http_route_match match; - - switch (lnm_http_router_route(&match, gctx->router, ctx->req.method, + switch (lnm_http_router_route(&ctx->match, gctx->router, ctx->req.method, ctx->req.buf.s + ctx->req.path.o)) { case lnm_http_route_err_match: - ctx->route = match.route; - ctx->cur_step = match.route->step; + ctx->cur_step = ctx->match.route->step; ctx->state = lnm_http_loop_state_parse_headers; break; case lnm_http_route_err_unknown_method: diff --git a/src/http/lnm_http_router.c b/src/http/lnm_http_router.c index dddf882..8b071db 100644 --- a/src/http/lnm_http_router.c +++ b/src/http/lnm_http_router.c @@ -53,10 +53,10 @@ lnm_err lnm_http_router_add(lnm_http_route **out, lnm_http_router *http_router, switch (c) { case ':': { - const char *next_slash_ptr = strchr(path, '/'); + const char *next_slash_ptr = strchr(path + 1, '/'); const char *new_path = - next_slash_ptr == NULL ? strchr(path, '\0') : next_slash_ptr; - size_t key_len = new_path - path - 1; + next_slash_ptr == NULL ? strchr(path + 1, '\0') : next_slash_ptr; + size_t key_len = new_path - (path + 1); if (key_len == 0) { res = lnm_err_invalid_route; diff --git a/test/routing.c b/test/routing.c index 788caaa..f21dbdb 100644 --- a/test/routing.c +++ b/test/routing.c @@ -1,6 +1,6 @@ #include "test.h" -#include "lnm/http/router.h" +#include "lnm/http/loop.h" void test_routing_simple() { lnm_http_router *router;