83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
#pragma once
|
|
|
|
#include "collatypes.h"
|
|
#include "str.h"
|
|
|
|
typedef struct arena_t arena_t;
|
|
typedef uintptr_t socket_t;
|
|
|
|
typedef enum {
|
|
HTTP_GET,
|
|
HTTP_POST,
|
|
HTTP_HEAD,
|
|
HTTP_PUT,
|
|
HTTP_DELETE
|
|
} http_method_e;
|
|
|
|
const char *httpGetStatusString(int status);
|
|
|
|
typedef struct {
|
|
uint8 major;
|
|
uint8 minor;
|
|
} http_version_t;
|
|
|
|
// translates a http_version_t to a single readable number (e.g. 1.1 -> 11, 1.0 -> 10, etc)
|
|
int httpVerNumber(http_version_t ver);
|
|
|
|
typedef struct http_header_t {
|
|
strview_t key;
|
|
strview_t value;
|
|
struct http_header_t *next;
|
|
} http_header_t;
|
|
|
|
typedef struct {
|
|
http_method_e method;
|
|
http_version_t version;
|
|
http_header_t *headers;
|
|
strview_t url;
|
|
strview_t body;
|
|
} http_req_t;
|
|
|
|
typedef struct {
|
|
int status_code;
|
|
http_version_t version;
|
|
http_header_t *headers;
|
|
strview_t body;
|
|
} http_res_t;
|
|
|
|
// strview_t request needs to be valid for http_req_t to be valid!
|
|
http_req_t httpParseReq(arena_t *arena, strview_t request);
|
|
http_res_t httpParseRes(arena_t *arena, strview_t response);
|
|
|
|
str_t httpReqToStr(arena_t *arena, http_req_t *req);
|
|
str_t httpResToStr(arena_t *arena, http_res_t *res);
|
|
|
|
bool httpHasHeader(http_header_t *headers, strview_t key);
|
|
void httpSetHeader(http_header_t *headers, strview_t key, strview_t value);
|
|
strview_t httpGetHeader(http_header_t *headers, strview_t key);
|
|
|
|
str_t httpMakeUrlSafe(arena_t *arena, strview_t string);
|
|
str_t httpDecodeUrlSafe(arena_t *arena, strview_t string);
|
|
|
|
typedef struct {
|
|
strview_t host;
|
|
strview_t uri;
|
|
} http_url_t;
|
|
|
|
http_url_t httpSplitUrl(strview_t url);
|
|
|
|
typedef struct {
|
|
arena_t *arena;
|
|
strview_t url;
|
|
http_method_e request_type;
|
|
http_header_t *headers;
|
|
int header_count;
|
|
strview_t body;
|
|
} http_request_desc_t;
|
|
|
|
// arena_t *arena, strview_t url, [ http_header_t *headers, int header_count, strview_t body ]
|
|
#define httpGet(arena, url, ...) httpRequest(&(http_request_desc_t){ arena, url, .request_type = HTTP_GET, __VA_ARGS__ })
|
|
#define httpsGet(arena, url, ...) httpsRequest(&(http_request_desc_t){ arena, url, .request_type = HTTP_GET, __VA_ARGS__ })
|
|
|
|
http_res_t httpRequest(http_request_desc_t *request);
|
|
buffer_t httpsRequest(http_request_desc_t *request);
|