feat: provide access to key segments from step

routing
Jef Roosens 2024-02-23 15:21:23 +01:00
parent e29e02ff85
commit 9fa009ccf4
Signed by: Jef Roosens
GPG Key ID: B75D4F293C7052DB
6 changed files with 51 additions and 11 deletions

44
example/routing.c 100644
View File

@ -0,0 +1,44 @@
#include <unistd.h>
#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));
}

View File

@ -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;

View File

@ -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;
}

View File

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

View File

@ -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;

View File

@ -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;