diff --git a/src/http-server.c b/src/http-server.c index 614e870..fa12f02 100644 --- a/src/http-server.c +++ b/src/http-server.c @@ -88,6 +88,7 @@ http_response* server_process_request(config_server* config, http_request *reque if (filepath_actual == NULL) { warning("realpath: not found/error", true); response = http_response_create_builtin(404, "File not found"); + http_header_list_add(response->headers, http_header_new(HEADER_CONNECTION, "close"), false); return response; } //Check that the file is within the server directory of the host @@ -116,6 +117,7 @@ http_response* server_process_request(config_server* config, http_request *reque if (file == NULL) { warning("failed to open file for reading", true); response = http_response_create_builtin(404, "File not found"); + http_header_list_add(response->headers, http_header_new(HEADER_CONNECTION, "close"), false); return response; } @@ -141,5 +143,11 @@ http_response* server_process_request(config_server* config, http_request *reque free(filepath_requested); free(filepath_actual); + //Check to see if client requested the connection be closed + http_header* request_connection = http_header_list_get(request->headers, HEADER_CONNECTION); + if (request_connection != NULL && strcasecmp(request_connection->content, "close") == 0) { + http_header_list_add(response->headers, http_header_new(HEADER_CONNECTION, "close"), false); + } + return response; } \ No newline at end of file diff --git a/src/http.c b/src/http.c index 5e8aa83..b1eb516 100644 --- a/src/http.c +++ b/src/http.c @@ -180,6 +180,7 @@ void http_header_list_add(http_header_list* list, http_header *header, bool repl free(header); } http_header* http_header_list_get(http_header_list* list, const char* name) { + http_header *elem; HTTP_HEADER_FOREACH(list, elem) { if (strcmp(elem->name, name) == 0) { return elem; @@ -190,6 +191,7 @@ http_header* http_header_list_get(http_header_list* list, const char* name) { http_header** http_header_list_getall(http_header_list* list, const char* name, size_t *out_header_count) { http_header **headers = NULL; size_t count = 0; + http_header *elem; HTTP_HEADER_FOREACH(list, elem) { if (strcmp(elem->name, name) == 0) { count++; @@ -245,6 +247,7 @@ char* http_request_write(http_request *req) { req->req->version == HTTP10 ? "HTTP/1.0" : "HTTP/1.1" ); + http_header *elem; HTTP_HEADER_FOREACH(req->headers, elem) { utstring_printf(output, "%s: %s\r\n", elem->name, elem->content); @@ -333,9 +336,13 @@ char* http_response_write(http_response *resp) { char dateStr[100] = {0}; strftime(dateStr, 99, FORMAT_HEADER_DATE, timeinfo); http_header_list_add(resp->headers, http_header_new(HEADER_DATE, dateStr), true); + + //Add server identifier header + http_header_list_add(resp->headers, http_header_new(HEADER_SERVER, SERVER_NAME), true); } //write headers + http_header *elem; HTTP_HEADER_FOREACH(resp->headers, elem) { utstring_printf(output, "%s: %s\r\n", elem->name, elem->content); } @@ -419,6 +426,7 @@ char* http_chunks_terminate(http_header_list *footers) { utstring_printf(output, "0\r\n"); if (footers != NULL) { //write footers + http_header *elem; HTTP_HEADER_FOREACH(footers, elem) { utstring_printf(output, "%s: %s\r\n", elem->name, elem->content); } diff --git a/src/http.h b/src/http.h index be5d838..70aea64 100644 --- a/src/http.h +++ b/src/http.h @@ -67,7 +67,7 @@ extern "C" { extern UT_icd http_header_icd; #define HTTP_HEADER_FOREACH(list, elem) \ - for ( http_header *elem= (http_header*)utarray_next(list,NULL); \ + for (elem= (http_header*)utarray_next(list,NULL); \ elem!= NULL; \ elem=(http_header*)utarray_next(list,elem)) diff --git a/src/main.c b/src/main.c index a8b2575..be33ceb 100644 --- a/src/main.c +++ b/src/main.c @@ -171,13 +171,13 @@ void skt_elem_write_response(skt_elem *elem, http_response *response, bool dispo char *response_str = http_response_write(response); utstring_printf(elem->info->write, "%s", response_str); free(response_str); - if (dispose == true) { - http_response_delete(response); - } http_header* connection_header = http_header_list_get(response->headers, HEADER_CONNECTION); if (connection_header != NULL && strcasecmp(connection_header->content, "close") == 0) { elem->info->close_afterwrite = true; } + if (dispose == true) { + http_response_delete(response); + } } void skt_elem_delete(skt_elem* elem) { if (elem->info!=NULL) skt_delete(elem->info); diff --git a/src/main.h b/src/main.h index afb1f40..7608e24 100644 --- a/src/main.h +++ b/src/main.h @@ -11,6 +11,8 @@ #ifdef __cplusplus extern "C" { #endif + +#define SERVER_NAME "KHTTP/0.1" #include #include "http_parser.h" diff --git a/testreq.txt b/testreq.txt index 6338ec5..663ef9c 100644 --- a/testreq.txt +++ b/testreq.txt @@ -4,4 +4,5 @@ Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 Referer: https://www.google.co.uk/ Accept-Language: en-US,en;q=0.8 +Connection: close