#ifndef NET_H #define NET_H #include #include #include //#include #include #include //#include #include #include #include #include #include #include #include #include "str/str.h" #include "list/list.h" #include "files/files.h" #include "log/log.h" #include "mime/mime.h" #include "rewrites/rewrites.h" #include #include #include #include #ifdef __linux__ #include #endif typedef enum http_method { GET, HEAD, OPTIONS, TRACE, DELETE, PUT, POST, PATCH } http_method; struct header { str name; str value; }; #define MAX_HEADERS 16 struct http_message { union { str method; str resp_ver; }; union { str url; str status; }; union { str req_ver; str reason; }; int hlen; struct header headers[MAX_HEADERS]; str body; }; typedef struct http_server { str port; int backlog; int ssocket; int csocket; int secure; SSL_CTX *ssl_ctx; SSL *ssl; } http_server; http_server *setup_http_server(str port, int backlog); void destroy_http_server(http_server **hs); int setup_https(http_server*hs, str certfile, str keyfile); void reset_https(http_server *hs); void terminate_https(http_server *hs); int accept_connection(http_server *hs, char ip[INET_ADDRSTRLEN]); int receive_request(http_server *hs, str *request); str generate_resource(url resource, str rurl); char *handlePOST(char *request); void build_http_message(char *request, int len, struct http_message *hm); enum http_method get_http_method(str method); url sanitize_url(str rurl); void send_file(http_server *hs, str filename); #endif