lander/include/http_loop.h

85 lines
1.7 KiB
C
Raw Normal View History

2023-05-27 11:47:39 +02:00
#ifndef LANDER_HTTP_LOOP
#define LANDER_HTTP_LOOP
2023-05-27 15:38:06 +02:00
#include <regex.h>
2023-05-27 11:47:39 +02:00
#include "event_loop.h"
2023-05-27 15:38:06 +02:00
#include "http.h"
2023-05-27 11:47:39 +02:00
#include "trie.h"
2023-05-27 15:38:06 +02:00
typedef enum http_route_type {
http_route_literal = 0,
http_route_regex = 1,
} http_route_type;
typedef struct http_route {
http_route_type type;
char *path;
regex_t *regex;
2023-05-27 16:42:15 +02:00
bool (*steps[5])(event_loop_conn *);
2023-05-27 15:38:06 +02:00
} http_route;
2023-05-27 11:47:39 +02:00
/*
* Global context passed to every connection using the same pointer
*/
typedef struct http_loop_gctx {
2023-05-27 16:42:15 +02:00
http_route *routes;
size_t route_count;
2023-05-27 11:47:39 +02:00
Trie *trie;
} http_loop_gctx;
2023-05-27 15:38:06 +02:00
/*
* Initialize a new global context
*/
2023-05-27 11:47:39 +02:00
http_loop_gctx *http_loop_gctx_init();
/*
* Invidivual context initialized for every connection
*/
typedef struct http_loop_ctx {
http_request req;
http_response res;
2023-05-27 15:38:06 +02:00
http_route *route;
size_t current_step;
2023-05-27 11:47:39 +02:00
http_loop_gctx *g;
} http_loop_ctx;
2023-05-27 15:38:06 +02:00
/*
* Initialize a context struct
*/
2023-05-27 11:47:39 +02:00
http_loop_ctx *http_loop_ctx_init(http_loop_gctx *g);
void http_loop_ctx_reset(http_loop_ctx *ctx);
2023-05-27 15:38:06 +02:00
/*
* Free a context struct
*/
2023-05-27 11:47:39 +02:00
void http_loop_ctx_free(http_loop_ctx *ctx);
2023-05-27 15:38:06 +02:00
/**
* Process incoming data as an HTTP request
*/
2023-05-27 11:47:39 +02:00
bool http_loop_handle_request(event_loop_conn *conn);
void http_loop_write_response(event_loop_conn *conn);
2023-05-27 17:14:49 +02:00
http_parse_error http_loop_parse_request(event_loop_conn *conn);
void http_loop_route_request(event_loop_conn *conn);
2023-05-27 16:42:15 +02:00
2023-05-27 15:38:06 +02:00
void http_loop_process_request(event_loop_conn *conn);
void http_loop_res_set_body(const char *body, size_t body_len);
void http_loop_res_set_type(http_response_type type);
2023-05-28 10:23:32 +02:00
void http_loop_write_standard_response(event_loop_conn *conn,
http_response_type type);
2023-05-27 15:38:06 +02:00
/**
* Initialize a new http loop
*/
2023-05-27 11:47:39 +02:00
event_loop *http_loop_init(http_loop_gctx *gctx);
#endif