#include #include "lnm/common.h" #include "lnm/http/loop.h" #include "lnm/http/loop_internal.h" #include "lnm/loop_internal.h" lnm_err lnm_http_loop_init(lnm_http_loop **out) { lnm_http_loop *hl = calloc(1, sizeof(lnm_http_loop)); if (hl == NULL) { return lnm_err_failed_alloc; } *out = hl; return lnm_err_ok; } lnm_err lnm_http_step_init(lnm_http_step **out, lnm_http_step_fn fn) { lnm_http_step *step = calloc(1, sizeof(lnm_http_step)); if (step == NULL) { return lnm_err_failed_alloc; } step->fn = fn; *out = step; return lnm_err_ok; } lnm_err lnm_http_step_append(lnm_http_step **out, lnm_http_step *step, lnm_http_step_fn fn) { LNM_RES(lnm_http_step_init(out, fn)); step->next = *out; return lnm_err_ok; } lnm_err lnm_http_route_init(lnm_http_route **out) { lnm_http_route *route = calloc(1, sizeof(lnm_http_route)); if (route == NULL) { return lnm_err_failed_alloc; } *out = route; return lnm_err_ok; } lnm_err lnm_http_route_init_literal(lnm_http_route **out, const char *path, lnm_http_step *step) { LNM_RES(lnm_http_route_init(out)); (*out)->type = lnm_http_route_type_literal; (*out)->route.s = path; (*out)->step = step; return lnm_err_ok; } lnm_err lnm_http_route_init_regex(lnm_http_route **out, const char *pattern, int regex_group_count, lnm_http_step *step) { regex_t *regex = calloc(1, sizeof(regex_t)); if (regex == NULL) { return lnm_err_failed_alloc; } if (regcomp(regex, pattern, REG_EXTENDED) != 0) { free(regex); return lnm_err_bad_regex; } LNM_RES2(lnm_http_route_init(out), free(regex)); (*out)->type = lnm_http_route_type_regex; (*out)->route.regex = regex; (*out)->regex_group_count = regex_group_count; (*out)->step = step; return lnm_err_ok; }