Web/request.h
2025-09-15 12:57:54 -05:00

83 lines
1.7 KiB
C

#ifndef REQUEST_H
#define REQUEST_H
#include <stddef.h>
#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