#ifndef REQUEST_H #define REQUEST_H #include #include "reactor/arena.h" typedef struct request request_t; typedef struct header header_t; // HTTP header struct header { char *name; char *value; header_t *next; }; // HTTP request struct request { // Request line char *method; char *path; char *version; char *query_string; // Headers header_t *headers; int header_count; // Body char *body; size_t body_len; // Parsed data char **param_names; char **param_values; int param_count; // Query parameters (parsed on demand) char **query_keys; char **query_values; int query_count; // Cookies (parsed on demand) char **cookie_names; char **cookie_values; int cookie_count; // Arena for allocations arena_t *arena; }; // Request creation and parsing request_t* request_new(arena_t *arena); int request_parse(request_t *req, const char *buf, size_t len); // Header access const char* request_header(request_t *req, const char *name); int request_has_header(request_t *req, const char *name); // Parameter access (from router) void request_set_params(request_t *req, char **names, char **values, int count); const char* request_param(request_t *req, const char *name); // Query parameter access const char* request_query(request_t *req, const char *name); int request_parse_query(request_t *req); // Cookie access const char* request_cookie(request_t *req, const char *name); int request_parse_cookies(request_t *req); // Body access const char* request_body(request_t *req); size_t request_body_len(request_t *req); // Utility functions int request_is_json(request_t *req); int request_is_form(request_t *req); int request_expects_json(request_t *req); const char* request_content_type(request_t *req); #endif // REQUEST_H