83 lines
1.7 KiB
C
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
|