diff options
Diffstat (limited to 'http.c')
-rw-r--r-- | http.c | 59 |
1 files changed, 27 insertions, 32 deletions
@@ -7,6 +7,8 @@ #include <string.h> #include <unistd.h> +static const int REQUEST_DATA_SIZE = 4096; + const char * status_str[] = { [STATUS_OK] = "200 OK", [STATUS_BAD_REQUEST] = "400 Bad Request", @@ -18,7 +20,7 @@ const char * status_str[] = { }; /// Allocates and initializes request structure. -/// \return Pointer to initialized request +/// \return Pointer to initialized request or NULL in case of an error /// \see /free_request struct request * new_request(void) { @@ -30,7 +32,15 @@ struct request * new_request(void) } memset(request, 0, sizeof(struct request)); - request->step = parse_method; + request->step = parse_step_method; + + request->data = malloc(REQUEST_DATA_SIZE); + + if (NULL == request->data) + { + free(request); + return NULL; + } return request; } @@ -42,7 +52,7 @@ void free_request(struct request * request) { if (NULL != request->data) { - // TODO: free(request->data); data lifetime is now managed by plop, move it here + free(request->data); } if (NULL != request->headers) @@ -92,15 +102,13 @@ int respond_with_body(const int fd, const enum status status, const char * body, /// Collects request between calls to `poll`. /// \param fd Client socket -/// \param request Buffer with the request content +/// \param request Pointer to current request context of handled client /// \return Number of bytes parsed, -1 if an error occured or 0 if expects more data -int collect_request(const int fd, char ** request) +int parse_request(const int fd, struct request ** request) { - static const int size = 4096; - if (NULL == *request) { - *request = malloc(size); + *request = new_request(); if (NULL == *request) { return -1; @@ -108,30 +116,17 @@ int collect_request(const int fd, char ** request) } // TODO: Expand buffer until EAGAIN or arbitrary limit - int length = read(fd, *request, size - 1); + int length = read(fd, (*request)->data, REQUEST_DATA_SIZE - 1); if (0 == length || (-1 == length && EWOULDBLOCK != errno && EAGAIN != errno)) { return -1; // TODO: Handle errors properly } - // TODO: Use struct request in plop - struct request * debug = new_request(); - debug->data = *request; - debug->length = length; - debug->step(debug); - - printf( - "(%.*s) [%.*s] %.*s\n", - debug->version.length, debug->data + debug->version.start, - debug->method.length, debug->data + debug->method.start, - debug->path.length, debug->data + debug->path.start); - - free_request(debug); - - (*request)[length] = 0; + (*request)->data[length] = 0; + (*request)->length = length; - return length; + return (*request)->step(*request); } @@ -199,7 +194,7 @@ static int read_rest_of_line(struct request * request) /// Parses method field of the request. /// \param request Request to process /// \return -1 if an error has occured, 0 if too little data available or total number of bytes processed -int parse_method(struct request * request) +int parse_step_method(struct request * request) { request->method.length = read_until_char(request, ' '); @@ -208,16 +203,16 @@ int parse_method(struct request * request) return 0; } - request->step = parse_path; + request->step = parse_step_path; - return parse_path(request); + return parse_step_path(request); } /// Parses path field of the request. /// \param request Request to process /// \return -1 if an error has occured, 0 if too little data available or total number of bytes processed // TODO: Consider spliting path into an actual path and arguments in this stage -int parse_path(struct request * request) +int parse_step_path(struct request * request) { if (0 >= request->path.start) { @@ -237,16 +232,16 @@ int parse_path(struct request * request) } request->path.length = request->position - request->path.start; - request->step = parse_version; + request->step = parse_step_version; - return parse_version(request); + return parse_step_version(request); } /// Parses and verifies http version field of the request. /// \param request Request to process /// \return -1 if an error has occured, 0 if too little data available or total number of bytes processed // TODO: Return -1 if version is unsupported, meaning other than HTTP/1.1 -int parse_version(struct request * request) +int parse_step_version(struct request * request) { if (0 >= request->version.start) { |