cMCP/inlcude/http.h

170 lines
3.7 KiB
C

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