#ifndef __HTTP_H__ #define __HTTP_H__ #include typedef enum { HTTP_M_ACL , HTTP_M_BASELINE_CONTROL , HTTP_M_BIND , HTTP_M_CHECKIN , HTTP_M_CHECKOUT , HTTP_M_CONNECT , HTTP_M_COPY , HTTP_M_DELETE , HTTP_M_GET , HTTP_M_HEAD , HTTP_M_LABEL , HTTP_M_LINK , HTTP_M_LOCK , HTTP_M_M_SEARCH , HTTP_M_MERGE , HTTP_M_MKACTIVITY , HTTP_M_MKCALENDAR , HTTP_M_MKCOL , HTTP_M_MKREDIRECTREF , HTTP_M_MKWORKSPACE , HTTP_M_MOVE , HTTP_M_NOTIFY , HTTP_M_OPTIONS , HTTP_M_ORDERPATCH , HTTP_M_PATCH , HTTP_M_POST , HTTP_M_PROPFIND , HTTP_M_PROPPATCH , HTTP_M_PURGE , HTTP_M_PUT , HTTP_M_QUERY , HTTP_M_REBIND , HTTP_M_REPORT , HTTP_M_SEARCH , HTTP_M_SOURCE , HTTP_M_SUBSCRIBE , HTTP_M_TRACE , HTTP_M_UNBIND , HTTP_M_UNCHECKOUT_UNLINK , HTTP_M_UNLOCK , HTTP_M_UNSUBSCRIBE , HTTP_M_UPDATE , HTTP_M_UPDATEREDIRECTREF , HTTP_M_VERSION_CONTROL , HTTP_M_UNKNOWN , } HTTP_M_Kind; typedef struct { char *key; char *value; } HTTP_Header; typedef struct { HTTP_Header *data; size_t size; size_t capacity; } HTTP_Headers; typedef struct { const char *url; const char *host; const char *port; const char *method; const char *schema; const char *path; void *body; size_t body_size; HTTP_Headers headers; const char *http_version; } HTTP_Request; typedef struct { HTTP_Request request; int status_code; const char *status_text; HTTP_Headers headers; void *body; size_t body_size; } HTTP_Response; typedef enum { HTTP_T_H1, HTTP_T_H2, HTTP_T_H3, } HTTP_T_Kind; // HTTP1.1 typedef struct { char *data; size_t size; size_t capacity; } HTTP_Request_Raw_1_1; typedef struct { char *data; size_t size; size_t capacity; } HTTP_Response_Raw_1_1; typedef struct { int sockfd; HTTP_Request_Raw_1_1 raw_req; HTTP_Response_Raw_1_1 raw_res; } HTTP_Transport_H1; // HTTP2 typedef struct { // HTTP3 not implemented } HTTP_Transport_H2; // HTTP3 typedef struct { // HTTP3 not implemented } HTTP_Transport_H3; typedef struct { HTTP_T_Kind kind; union { HTTP_Transport_H1 h1; HTTP_Transport_H2 h2; HTTP_Transport_H3 h3; }; } HTTP_Transport; HTTP_Request *http_request_create(); int http_request_init(HTTP_Request *req); int http_request_free(HTTP_Request *req); HTTP_Response *http_response_create(HTTP_Request *req); int http_response_init(HTTP_Response *res, HTTP_Request *req); int http_response_free(HTTP_Response *res); HTTP_M_Kind http_str_to_method(const char *method); const char *http_method_to_str(HTTP_M_Kind method); HTTP_Headers http_new_headers(); int http_add_header(HTTP_Headers *headers, const char *key, const char *value); int http_connect_to_host(const char* url, const char *port); int http_build_request(HTTP_Request *req, HTTP_Transport *t); //HTTP_Request_Raw *http_build_request(HTTP_Request *req); int http_request( const char *url, const char *method, void *body, size_t body_size, HTTP_Headers *headers) ; // TODO: EXPERIMENTAL HTTP_Transport *http_transport_new(HTTP_T_Kind kind); int http_transport_init(HTTP_Transport *t, HTTP_T_Kind kind); int http_transport_connect(HTTP_Transport *t, HTTP_Request *req); int http_transport_send(HTTP_Transport *t, HTTP_Request *req); int http_transport_recv(HTTP_Transport *t, HTTP_Response *res); void http_transport_close(HTTP_Transport *t); #endif //__HTTP_H__