From 9239ee0dbee152f8ebbd12726d8bdc6d5720e2f4 Mon Sep 17 00:00:00 2001 From: cflip Date: Sat, 3 Jun 2023 11:52:47 -0600 Subject: Respond with 501 Not Implemented for unknown request methods --- cfws.c | 19 ++++++++++++++----- http.c | 10 +++++++--- http.h | 5 ++++- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/cfws.c b/cfws.c index afe2a1d..19a8d0b 100644 --- a/cfws.c +++ b/cfws.c @@ -39,13 +39,21 @@ int main(int argc, char *argv[]) static void handle_request(const struct http_request *req, int sockfd) { - char *filepath; + char *filepath = NULL; enum http_res_code res_code; enum serve_method method; - /* Find the local path for the resource and decide how to serve it. */ - filepath = file_path_for_uri(req->uri); - method = file_method_for_path(filepath, &res_code); + if (req->method == HTTP_METHOD_UNKNOWN) { + method = SERVE_METHOD_ERROR; + res_code = HTTP_RESPONSE_NOTIMPLEMENTED; + } else if (req->uri == NULL) { + method = SERVE_METHOD_ERROR; + res_code = HTTP_RESPONSE_BADREQUEST; + } else { + /* Find the local path for the resource and decide how to serve it. */ + filepath = file_path_for_uri(req->uri); + method = file_method_for_path(filepath, &res_code); + } /* Write the status line and (TODO) extra headers */ http_response_statusline(res_code, sockfd); @@ -65,5 +73,6 @@ static void handle_request(const struct http_request *req, int sockfd) } } - free(filepath); + if (filepath) + free(filepath); } diff --git a/http.c b/http.c index fb536c8..01a80d4 100644 --- a/http.c +++ b/http.c @@ -13,7 +13,7 @@ struct http_request http_parse_request(const char *reqstr) const char *counter; struct http_request req; - req.method = HTTP_METHOD_GET; + req.method = HTTP_METHOD_UNKNOWN; req.uri = NULL; req.query_str = NULL; @@ -23,6 +23,8 @@ struct http_request http_parse_request(const char *reqstr) return req; } + req.method = HTTP_METHOD_GET; + counter = reqstr + 4; while (*counter != ' ' && *counter != '?' && *counter != 0 && urilen < CFWS_MAXURI) { @@ -62,9 +64,11 @@ void http_free_request(struct http_request *req) free(req->query_str); } -static const char *response_msg[2] = { +static const char *response_msg[] = { "200 OK", - "404 Not Found" + "400 Bad Request", + "404 Not Found", + "501 Not Implemented" }; void http_response_statusline(enum http_res_code status_code, int sockfd) diff --git a/http.h b/http.h index 89576f6..90bd4f3 100644 --- a/http.h +++ b/http.h @@ -7,12 +7,15 @@ #define CFWS_MAX_RESPONSE 4096 enum http_req_method { + HTTP_METHOD_UNKNOWN, HTTP_METHOD_GET }; enum http_res_code { HTTP_RESPONSE_OK, - HTTP_RESPONSE_NOTFOUND + HTTP_RESPONSE_BADREQUEST, + HTTP_RESPONSE_NOTFOUND, + HTTP_RESPONSE_NOTIMPLEMENTED }; struct http_request { -- cgit v1.2.3