diff --git a/src/Makefile b/src/Makefile index c58bff4..4c369b4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -10,7 +10,7 @@ $(TARGET): $(OBJ) main.o: include/tcp.h tcp.o: include/tcp.h include/http.h -http.o: include/http.h +http.o: include/http.h include/file.h file.o: include/file.h .PHONY: clean diff --git a/src/http.c b/src/http.c index 253061b..8f778e4 100644 --- a/src/http.c +++ b/src/http.c @@ -3,22 +3,7 @@ #include #include "include/http.h" - -// what we want to do here is start parsing the http message - -// GET / HTTP/1.1 -// Host: localhost:8080 -// User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:134.0) Gecko/20100101 Firefox/134.0 -// Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 -// Accept-Language: en-US,en;q=0.5 -// Accept-Encoding: gzip, deflate, br, zstd -// Connection: keep-alive -// Upgrade-Insecure-Requests: 1 -// Sec-Fetch-Dest: document -// Sec-Fetch-Mode: navigate -// Sec-Fetch-Site: none -// Sec-Fetch-User: ?1 -// Priority: u=0, i +#include "include/file.h" http_method_t str_to_http_method(char* input) { @@ -132,11 +117,70 @@ const char* http_status_code_to_str(http_status_code_t code) } } +void init_general_headers(struct general_headers* headers) +{ + headers->cache_control = ""; + headers->connection = ""; + headers->date = ""; + headers->pragma = ""; + headers->trailer = ""; + headers->transfer_encoding = ""; + headers->upgrade = ""; + headers->via = ""; + headers->warning = ""; + +} + +void init_http_request(http_request* request) +{ + init_general_headers(&(request->general_headers)); + + request->request_headers.accept = ""; + request->request_headers.accept_charset = ""; + request->request_headers.accept_encoding = ""; + request->request_headers.accept_language = ""; + request->request_headers.authorization = ""; + request->request_headers.expect = ""; + request->request_headers.from = ""; + request->request_headers.host = ""; + request->request_headers.if_match = ""; + request->request_headers.if_modified_since = ""; + request->request_headers.if_none_match = ""; + request->request_headers.if_range = ""; + request->request_headers.if_unmodified_since = ""; + request->request_headers.max_forwards = ""; + request->request_headers.proxy_authorization = ""; + request->request_headers.range = ""; + request->request_headers.referer = ""; + request->request_headers.te = ""; + request->request_headers.user_agent = ""; +} + +void init_http_response(http_response* response) +{ + init_general_headers(&(response->general_headers)); + + response->response_headers.accept_ranges = ""; + response->response_headers.age = 0; + response->response_headers.etag = ""; + response->response_headers.location = ""; + response->response_headers.proxy_authenticate = ""; + response->response_headers.retry_after = ""; + response->response_headers.server = ""; + response->response_headers.vary = ""; + response->response_headers.www_authenticate = ""; +} + void free_http_request(http_request* request) { free(request->request_line.request_uri); } +void free_http_response(http_response* response) +{ + free(response->message_body); +} + void parse_request_line(char** line, http_request_line* request) { char *tok, *ver, *num; @@ -228,3 +272,10 @@ void parse_http_request(char** buffer, http_request* request) } */ } + +void create_http_response(http_request* request, http_response* response) +{ + get_file_from_uri(&(request->request_line.request_uri), &(response->message_body)); + + response->message_len = strlen(response->message_body); +} diff --git a/src/include/http.h b/src/include/http.h index 274d9af..76ec619 100644 --- a/src/include/http.h +++ b/src/include/http.h @@ -56,8 +56,8 @@ typedef struct { typedef struct { http_status_line status; - struct general_headers general; - struct response_headers response; + struct general_headers general_headers; + struct response_headers response_headers; size_t message_len; char* message_body; } http_response; @@ -70,6 +70,15 @@ const char* http_status_code_to_str(http_status_code_t code); void parse_request_line(char** line, http_request_line* request); +void init_general_headers(struct general_headers* headers); +void init_http_request(http_request* request); +void init_http_response(http_response* response); + +void free_http_request(http_request* request); +void free_http_response(http_response* response); + void parse_http_request(char** buffer, http_request* request); +void create_http_response(http_request* request, http_response* response); + #endif diff --git a/src/main.c b/src/main.c index 829bda1..13ac8df 100644 --- a/src/main.c +++ b/src/main.c @@ -16,6 +16,16 @@ * but eventually i would like to start implementing headers * * file config for port, file location, etc + * + * send INTERNAL SERVER ERROR for failures instead of exiting the thread + * + * send 404 for if the file couldnt be found (use errno for this) + * + * setup the http_request parser to fill the request struct + * + * set the init_response to fill the required default headers (e.g. date) + * + * TODO: see where content-length is supposed to be ? */ diff --git a/src/tcp.c b/src/tcp.c index 1a53838..e2727fe 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -92,6 +92,7 @@ void* connection_handler(void* arg) { int client_socket = *(int*) arg; http_request request; + http_response response; //http_request_line request; char* buffer = NULL; int err; @@ -119,7 +120,8 @@ void* connection_handler(void* arg) // create payload - // get the file + create_http_response(&request, &response); + free_http_request(&request); // send payload