170 lines
3.7 KiB
C
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__
|
|
|