From e56f8f371535fd32e657ae204c43565f8a6d5f65 Mon Sep 17 00:00:00 2001 From: Sam Stevens Date: Fri, 18 Jul 2014 23:40:15 +0100 Subject: [PATCH] Work on request header parsing --- dist/Debug/GNU-Linux-x86/khttp | Bin 42456 -> 0 bytes nbproject/private/configurations.xml | 2 + src/http/http.c | 29 ++++++++++++- src/http/http.h | 7 ++- src/http/request.c | 62 ++++++++++++++++++++++++++- src/http/request.h | 3 +- src/main.c | 56 ++++++++++++++++++++++++ src/main.h | 2 + src/socket.h | 4 +- src/ut/utarray.h | 7 ++- 10 files changed, 165 insertions(+), 7 deletions(-) delete mode 100755 dist/Debug/GNU-Linux-x86/khttp diff --git a/dist/Debug/GNU-Linux-x86/khttp b/dist/Debug/GNU-Linux-x86/khttp deleted file mode 100755 index 923439d37f5e82e7ac9bc62dbc3357464b9a3851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42456 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 diff --git a/nbproject/private/configurations.xml b/nbproject/private/configurations.xml index a0dea49..daa4a74 100644 --- a/nbproject/private/configurations.xml +++ b/nbproject/private/configurations.xml @@ -13,6 +13,8 @@ + + diff --git a/src/http/http.c b/src/http/http.c index 203f949..557d6f0 100644 --- a/src/http/http.c +++ b/src/http/http.c @@ -3,6 +3,7 @@ #include #include #include "http.h" +#include "../main.h" /* * METHOD_GET, METHOD_POST, METHOD_HEAD, METHOD_PUT, @@ -32,7 +33,7 @@ http_method http_method_fromstring(const char* method) { METHOD_CONNECT}; size_t count = sizeof(methods) / sizeof(http_method); - for(int i; i < count; i++) { + for(int i=0; i < count; i++) { if (strcmp(http_method_getstring(methods[i],NULL), method) == 0) { return methods[i]; } @@ -42,6 +43,9 @@ http_method http_method_fromstring(const char* method) { http_request_line *http_request_line_new(http_method method, const char* other) { http_request_line *req = calloc(1, sizeof(http_request_line)); + if (req == NULL) { + fatal("calloc failed"); + } req->method = method; if (req->method == METHOD_OTHER) { req->method_other = calloc(strlen(other)+1, sizeof(char)); @@ -59,6 +63,9 @@ void http_request_line_delete(http_request_line *req) { http_response_line *http_response_line_new(uint16_t code) { http_response_line *resp = calloc(1, sizeof(http_response_line)); + if (resp == NULL) { + fatal("calloc failed"); + } resp->code = code; resp->version = HTTP11; return resp; @@ -117,7 +124,9 @@ void http_reponse_line_delete(http_response_line *resp) { http_header *http_header_new(const char* name) { http_header *header = calloc(1, sizeof(http_header)); - + if (header == NULL) { + fatal("calloc failed"); + } header->name = calloc(strlen(name)+1, sizeof(char)); strcpy(header->name, name); @@ -126,10 +135,16 @@ http_header *http_header_new(const char* name) { void http_header_append_content(http_header *header, const char* content) { if (header->content == NULL) { header->content = calloc(strlen(content)+1, sizeof(char)); + if (header->content == NULL) { + fatal("calloc failed"); + } strcpy(header->content, content); } else { uint32_t newlen = strlen(header->content) + strlen(content) + 1; header->content = realloc(header->content, newlen); + if (header->content == NULL) { + fatal("calloc failed"); + } strcat(header->content, content); } } @@ -141,13 +156,20 @@ void http_header_delete(http_header *header) { http_request *http_request_new() { http_request *req = calloc(1, sizeof(http_request)); + if (req == NULL) { + fatal("calloc failed"); + } req->header_count = 0; req->body = NULL; + req->parsestatus = PARSE_REQUESTLINE; return req; } void http_request_add_header(http_request *req, http_header *header) { req->header_count++; req->headers = realloc(req->headers, req->header_count * sizeof(http_header*)); + if (req->headers == NULL) { + fatal("calloc failed"); + } req->headers[req->header_count-1] = header; } void http_request_apppend_body(http_request *req, const char* body) { @@ -157,6 +179,9 @@ void http_request_apppend_body(http_request *req, const char* body) { } bodylen += strlen(body) + 1; req->body = realloc(req->body, bodylen * sizeof(char)); + if (req->body == NULL) { + fatal("calloc failed"); + } strcat(req->body, body); } void http_request_delete(http_request *req) { diff --git a/src/http/http.h b/src/http/http.h index 1ca2ec7..9fef224 100644 --- a/src/http/http.h +++ b/src/http/http.h @@ -13,7 +13,6 @@ extern "C" { #endif #include -#include "request.h" typedef enum http_method { METHOD_GET, METHOD_POST, METHOD_HEAD, METHOD_PUT, @@ -43,13 +42,19 @@ extern "C" { char* content; } http_header; + typedef enum http_request_parsestatus { + PARSE_REQUESTLINE, PARSE_HEADERS, PARSE_BODY, PARSE_DONE, PARSE_FAIL + } http_request_parsestatus; + typedef struct http_request { http_request_line *req; + http_request_parsestatus parsestatus; http_header **headers; uint32_t header_count; char *body; } http_request; + char* http_method_getstring(http_method method, char* method_other); http_method http_method_fromstring(const char* method); diff --git a/src/http/request.c b/src/http/request.c index aded04b..45ed0ad 100644 --- a/src/http/request.c +++ b/src/http/request.c @@ -1,6 +1,66 @@ #include #include #include +#include +#include "../main.h" #include "http.h" - +char* parse_request(http_request *req, char *input) { + size_t line_count; + char** lines = str_splitlines(input, &line_count); + + switch(req->parsestatus) { + case PARSE_REQUESTLINE: + if (line_count == 0) { + break; + } + + char* requestStr = lines[0]; + + char methodStr[20] = {0}; + char uriStr[1024] = {0}; + char versionStr[16] = {0}; + + int count = sscanf(requestStr, "%19s%*[ \t]%1023s%*[ \t]%15s", methodStr, uriStr, versionStr); + if (count < 3) { + req->parsestatus = PARSE_FAIL; + break; + } + + http_method method = http_method_fromstring(methodStr); + if (method == METHOD_INVALID) { + req->parsestatus = PARSE_FAIL; + break; + } + + http_version version; + if (strcasecmp(versionStr, "HTTP/1.0") == 0) { version = HTTP10; } + if (strcasecmp(versionStr, "HTTP/1.1") == 0) { version = HTTP11; } + + http_request_line *request_line = http_request_line_new(method, NULL); + request_line->version = version; + request_line->uri = calloc(strlen(uriStr)+1, sizeof(char)); + if (request_line->uri == NULL) { + fatal("calloc failed"); + } + strcpy(request_line->uri, uriStr); + req->req = request_line; + req->parsestatus = PARSE_HEADERS; + + break; + case PARSE_HEADERS: + break; + case PARSE_BODY: + break; + case PARSE_DONE: + case PARSE_FAIL: + break; + } + + for(size_t i=0; i < line_count; i++) { + free(lines[i]); + free(lines); + } + + return NULL; +} \ No newline at end of file diff --git a/src/http/request.h b/src/http/request.h index bde8df1..79dcb5c 100644 --- a/src/http/request.h +++ b/src/http/request.h @@ -12,9 +12,10 @@ extern "C" { #endif +#include "../ut/utstring.h" #include "http.h" - + char* parse_request(http_request *req, char *input); #ifdef __cplusplus diff --git a/src/main.c b/src/main.c index 26f0e13..c0e3456 100644 --- a/src/main.c +++ b/src/main.c @@ -12,16 +12,26 @@ #include #include "ut/utlist.h" +#include "ut/utarray.h" #include "main.h" #include "socket.h" +#include "http/http.h" +#include "http/request.h" int serverfd = 0; +char* teststr = "GET /testing/123 HTTP/1.1\r\n"; /* * */ int main(int argc, char** argv) { + /*char *test = calloc(strlen(teststr)+1, sizeof(char)); + strcpy(test, teststr); + http_request *req = http_request_new(); + parse_request(req, test); + + return 0;*/ skt_elem *connections = NULL; serverfd = svr_create(); @@ -38,6 +48,7 @@ int main(int argc, char** argv) { if (info != NULL) { skt_elem* newconn = calloc(1, sizeof(skt_elem)); newconn->info = info; + newconn->current_request = http_request_new(); LL_APPEND(connections, newconn); } } @@ -90,6 +101,9 @@ int main(int argc, char** argv) { if (elem->info->closed) { LL_DELETE(connections, elem); skt_delete(elem->info); + if (elem->current_request != NULL) { + http_request_delete(elem->current_request); + } free(elem); } } @@ -124,4 +138,46 @@ void info(char* msg, ...) { vfprintf(stdout, msg, va); fputc('\n', stdout); va_end(va); +} + +char** str_splitlines(char *str, size_t *line_count) { + char **result; + *line_count = 0; + char *tmp = str; + + while(*tmp) { + if (*tmp == '\n') { + (*line_count)++; + } + tmp++; + } + if (*line_count == 0) { + result = calloc(1, sizeof(char*)); + result[0] = calloc(strlen(str), sizeof(char)); + strcpy(result[0], str); + return result; + } + result = calloc(*line_count, sizeof(char*)); + if (result == NULL) { + fatal("calloc failed"); + } + + size_t i=0, linelen = 0; + char *line = strtok(str, "\n"); + while(line) { + linelen = strlen(line); + result[i] = calloc(linelen+1, sizeof(char)); + if (result[i] == NULL) { + fatal("calloc failed"); + } + strcpy(result[i], line); + if (result[i][linelen-1] == '\r') { + result[i][linelen-1] = '\0'; + result[i] = realloc(result[i], linelen); + } + line = strtok(NULL, "\n"); + i++; + } + + return result; } \ No newline at end of file diff --git a/src/main.h b/src/main.h index f5146a4..2299e58 100644 --- a/src/main.h +++ b/src/main.h @@ -20,6 +20,8 @@ void fatal(char* msg); void warning(char* msg, bool showPError); void info(char* msg, ...); +char** str_splitlines(char *str, size_t *line_count); + #ifdef __cplusplus } diff --git a/src/socket.h b/src/socket.h index e6cfb4b..f161c65 100644 --- a/src/socket.h +++ b/src/socket.h @@ -17,8 +17,9 @@ extern "C" { #include #include #include +#include "http/http.h" #include "ut/utstring.h" - + typedef struct skt_info skt_info; struct skt_info { @@ -36,6 +37,7 @@ extern "C" { typedef struct skt_elem { skt_info* info; + http_request *current_request; struct skt_elem *next; } skt_elem; diff --git a/src/ut/utarray.h b/src/ut/utarray.h index dcddd72..a6f70dd 100644 --- a/src/ut/utarray.h +++ b/src/ut/utarray.h @@ -218,7 +218,12 @@ typedef struct { /* last we pre-define a few icd for common utarrays of ints and strings */ static void utarray_str_cpy(void *dst, const void *src) { char **_src = (char**)src, **_dst = (char**)dst; - *_dst = (*_src == NULL) ? NULL : strdup(*_src); + if (*_src != NULL) { + *_dst = calloc(strlen(*_src)+1, sizeof(char)); + if (*_dst != NULL) { + strcpy(*_dst, *_src); + } + } } static void utarray_str_dtor(void *elt) { char **eltc = (char**)elt;