Major refactoring
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
#ifndef HTTP_PARSE_INCLUDED
|
||||
#define HTTP_PARSE_INCLUDED
|
||||
|
||||
#include "basic.h"
|
||||
|
||||
#define CHTTP_MAX_HEADERS 32
|
||||
|
||||
typedef struct {
|
||||
unsigned int data;
|
||||
} CHTTP_IPv4;
|
||||
|
||||
typedef struct {
|
||||
unsigned short data[8];
|
||||
} CHTTP_IPv6;
|
||||
|
||||
typedef enum {
|
||||
CHTTP_HOST_MODE_VOID = 0,
|
||||
CHTTP_HOST_MODE_NAME,
|
||||
CHTTP_HOST_MODE_IPV4,
|
||||
CHTTP_HOST_MODE_IPV6,
|
||||
} CHTTP_HostMode;
|
||||
|
||||
typedef struct {
|
||||
CHTTP_HostMode mode;
|
||||
string text;
|
||||
union {
|
||||
string name;
|
||||
CHTTP_IPv4 ipv4;
|
||||
CHTTP_IPv6 ipv6;
|
||||
};
|
||||
} CHTTP_Host;
|
||||
|
||||
typedef struct {
|
||||
string userinfo;
|
||||
CHTTP_Host host;
|
||||
int port;
|
||||
} CHTTP_Authority;
|
||||
|
||||
// ZII
|
||||
typedef struct {
|
||||
string scheme;
|
||||
CHTTP_Authority authority;
|
||||
string path;
|
||||
string query;
|
||||
string fragment;
|
||||
} CHTTP_URL;
|
||||
|
||||
typedef enum {
|
||||
CHTTP_METHOD_GET,
|
||||
CHTTP_METHOD_HEAD,
|
||||
CHTTP_METHOD_POST,
|
||||
CHTTP_METHOD_PUT,
|
||||
CHTTP_METHOD_DELETE,
|
||||
CHTTP_METHOD_CONNECT,
|
||||
CHTTP_METHOD_OPTIONS,
|
||||
CHTTP_METHOD_TRACE,
|
||||
CHTTP_METHOD_PATCH,
|
||||
} CHTTP_Method;
|
||||
|
||||
typedef struct {
|
||||
string name;
|
||||
string value;
|
||||
} CHTTP_Header;
|
||||
|
||||
typedef struct {
|
||||
bool secure;
|
||||
CHTTP_Method method;
|
||||
CHTTP_URL url;
|
||||
int minor;
|
||||
int num_headers;
|
||||
CHTTP_Header headers[CHTTP_MAX_HEADERS];
|
||||
string body;
|
||||
} CHTTP_Request;
|
||||
|
||||
typedef struct {
|
||||
void* context;
|
||||
int minor;
|
||||
int status;
|
||||
string reason;
|
||||
int num_headers;
|
||||
CHTTP_Header headers[CHTTP_MAX_HEADERS];
|
||||
string body;
|
||||
} CHTTP_Response;
|
||||
|
||||
int chttp_parse_ipv4(char *src, int len, CHTTP_IPv4 *ipv4);
|
||||
int chttp_parse_ipv6(char *src, int len, CHTTP_IPv6 *ipv6);
|
||||
int chttp_parse_url(char *src, int len, CHTTP_URL *url);
|
||||
int chttp_parse_request(char *src, int len, CHTTP_Request *req);
|
||||
int chttp_parse_response(char *src, int len, CHTTP_Response *res);
|
||||
|
||||
int chttp_find_header(CHTTP_Header *headers, int num_headers, string name);
|
||||
|
||||
string chttp_get_cookie(CHTTP_Request *req, string name);
|
||||
string chttp_get_param(string body, string str, char *mem, int cap);
|
||||
int chttp_get_param_i(string body, string str);
|
||||
|
||||
// Checks whether the request was meant for the host with the given
|
||||
// domain an port. If port is -1, the default value of 80 is assumed.
|
||||
bool chttp_match_host(CHTTP_Request *req, string domain, int port);
|
||||
|
||||
// Date and cookie types for Set-Cookie header parsing
|
||||
typedef enum {
|
||||
CHTTP_WEEKDAY_MON,
|
||||
CHTTP_WEEKDAY_TUE,
|
||||
CHTTP_WEEKDAY_WED,
|
||||
CHTTP_WEEKDAY_THU,
|
||||
CHTTP_WEEKDAY_FRI,
|
||||
CHTTP_WEEKDAY_SAT,
|
||||
CHTTP_WEEKDAY_SUN,
|
||||
} CHTTP_WeekDay;
|
||||
|
||||
typedef enum {
|
||||
CHTTP_MONTH_JAN,
|
||||
CHTTP_MONTH_FEB,
|
||||
CHTTP_MONTH_MAR,
|
||||
CHTTP_MONTH_APR,
|
||||
CHTTP_MONTH_MAY,
|
||||
CHTTP_MONTH_JUN,
|
||||
CHTTP_MONTH_JUL,
|
||||
CHTTP_MONTH_AUG,
|
||||
CHTTP_MONTH_SEP,
|
||||
CHTTP_MONTH_OCT,
|
||||
CHTTP_MONTH_NOV,
|
||||
CHTTP_MONTH_DEC,
|
||||
} CHTTP_Month;
|
||||
|
||||
typedef struct {
|
||||
CHTTP_WeekDay week_day;
|
||||
int day;
|
||||
CHTTP_Month month;
|
||||
int year;
|
||||
int hour;
|
||||
int minute;
|
||||
int second;
|
||||
} CHTTP_Date;
|
||||
|
||||
typedef struct {
|
||||
string name;
|
||||
string value;
|
||||
|
||||
bool secure;
|
||||
bool chttp_only;
|
||||
|
||||
bool have_date;
|
||||
CHTTP_Date date;
|
||||
|
||||
bool have_max_age;
|
||||
uint32_t max_age;
|
||||
|
||||
bool have_domain;
|
||||
string domain;
|
||||
|
||||
bool have_path;
|
||||
string path;
|
||||
} CHTTP_SetCookie;
|
||||
|
||||
// Parses a Set-Cookie header value
|
||||
// Returns 0 on success, -1 on error
|
||||
int chttp_parse_set_cookie(string str, CHTTP_SetCookie *out);
|
||||
|
||||
#endif // HTTP_PARSE_INCLUDED
|
||||
Reference in New Issue
Block a user