From 6d3ca314d40da0b56dd8b11145a53d49247bffb0 Mon Sep 17 00:00:00 2001 From: Sam Stevens Date: Fri, 18 Jul 2014 16:52:50 +0100 Subject: [PATCH] Initial work on http request/response processing --- .dep.inc | 5 + .gitignore | 2 + dist/Debug/GNU-Linux-x86/khttp | Bin 0 -> 42456 bytes nbproject/Makefile-Debug.mk | 12 ++ nbproject/Makefile-Release.mk | 12 ++ nbproject/configurations.xml | 20 ++++ nbproject/private/configurations.xml | 2 - nbproject/private/private.xml | 5 +- src/http/http.c | 170 +++++++++++++++++++++++++++ src/http/http.h | 78 ++++++++++++ src/http/request.c | 6 + src/http/request.h | 25 ++++ src/main.c | 16 ++- src/socket.c | 7 +- src/socket.h | 3 +- 15 files changed, 351 insertions(+), 12 deletions(-) create mode 100644 .dep.inc create mode 100644 .gitignore create mode 100755 dist/Debug/GNU-Linux-x86/khttp create mode 100644 src/http/http.c create mode 100644 src/http/http.h create mode 100644 src/http/request.c create mode 100644 src/http/request.h diff --git a/.dep.inc b/.dep.inc new file mode 100644 index 0000000..4560e55 --- /dev/null +++ b/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2247d5f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/build +/dist diff --git a/dist/Debug/GNU-Linux-x86/khttp b/dist/Debug/GNU-Linux-x86/khttp new file mode 100755 index 0000000000000000000000000000000000000000..923439d37f5e82e7ac9bc62dbc3357464b9a3851 GIT binary patch literal 42456 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 literal 0 HcmV?d00001 diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk index aecd631..69013e7 100644 --- a/nbproject/Makefile-Debug.mk +++ b/nbproject/Makefile-Debug.mk @@ -35,6 +35,8 @@ OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} # Object Files OBJECTFILES= \ + ${OBJECTDIR}/src/http/http.o \ + ${OBJECTDIR}/src/http/request.o \ ${OBJECTDIR}/src/main.o \ ${OBJECTDIR}/src/socket.o @@ -63,6 +65,16 @@ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/khttp: ${OBJECTFILES} ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} ${LINK.c} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/khttp ${OBJECTFILES} ${LDLIBSOPTIONS} +${OBJECTDIR}/src/http/http.o: src/http/http.c + ${MKDIR} -p ${OBJECTDIR}/src/http + ${RM} "$@.d" + $(COMPILE.c) -g -Wall -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/http/http.o src/http/http.c + +${OBJECTDIR}/src/http/request.o: src/http/request.c + ${MKDIR} -p ${OBJECTDIR}/src/http + ${RM} "$@.d" + $(COMPILE.c) -g -Wall -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/http/request.o src/http/request.c + ${OBJECTDIR}/src/main.o: src/main.c ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk index 676d3bd..b96724e 100644 --- a/nbproject/Makefile-Release.mk +++ b/nbproject/Makefile-Release.mk @@ -35,6 +35,8 @@ OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} # Object Files OBJECTFILES= \ + ${OBJECTDIR}/src/http/http.o \ + ${OBJECTDIR}/src/http/request.o \ ${OBJECTDIR}/src/main.o \ ${OBJECTDIR}/src/socket.o @@ -63,6 +65,16 @@ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/khttp: ${OBJECTFILES} ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} ${LINK.c} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/khttp ${OBJECTFILES} ${LDLIBSOPTIONS} +${OBJECTDIR}/src/http/http.o: src/http/http.c + ${MKDIR} -p ${OBJECTDIR}/src/http + ${RM} "$@.d" + $(COMPILE.c) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/http/http.o src/http/http.c + +${OBJECTDIR}/src/http/request.o: src/http/request.c + ${MKDIR} -p ${OBJECTDIR}/src/http + ${RM} "$@.d" + $(COMPILE.c) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/http/request.o src/http/request.c + ${OBJECTDIR}/src/main.o: src/main.c ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" diff --git a/nbproject/configurations.xml b/nbproject/configurations.xml index f147ed1..b277912 100644 --- a/nbproject/configurations.xml +++ b/nbproject/configurations.xml @@ -4,7 +4,9 @@ + src/http/http.h src/main.h + src/http/request.h src/socket.h + src/http/http.c src/main.c + src/http/request.c src/socket.c 2 + + + + + + + + @@ -75,6 +87,14 @@ 5 + + + + + + + + diff --git a/nbproject/private/configurations.xml b/nbproject/private/configurations.xml index daa4a74..a0dea49 100644 --- a/nbproject/private/configurations.xml +++ b/nbproject/private/configurations.xml @@ -13,8 +13,6 @@ - - diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index c6aa339..873fa0e 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -8,10 +8,13 @@ file:/home/sam/NetBeansProjects/KHttp/src/socket.c + file:/home/sam/NetBeansProjects/KHttp/src/http/http.h file:/home/sam/NetBeansProjects/KHttp/src/main.h + file:/home/sam/NetBeansProjects/KHttp/src/http/request.h file:/home/sam/NetBeansProjects/KHttp/src/main.c - file:/home/sam/NetBeansProjects/KHttp/src/ut/utlist.h file:/home/sam/NetBeansProjects/KHttp/src/socket.h + file:/home/sam/NetBeansProjects/KHttp/src/http/request.c + file:/home/sam/NetBeansProjects/KHttp/src/http/http.c diff --git a/src/http/http.c b/src/http/http.c new file mode 100644 index 0000000..203f949 --- /dev/null +++ b/src/http/http.c @@ -0,0 +1,170 @@ +#include +#include +#include +#include +#include "http.h" + +/* + * METHOD_GET, METHOD_POST, METHOD_HEAD, METHOD_PUT, + METHOD_DELETE, METHOD_OPTIONS, METHOD_TRACE, + METHOD_CONNECT, METHOD_OTHER + */ + +char* http_method_getstring(http_method method, char* method_other) { + switch(method) { + case METHOD_GET: return "GET"; + case METHOD_POST: return "POST"; + case METHOD_HEAD: return "HEAD"; + case METHOD_PUT: return "PUT"; + case METHOD_DELETE: return "DELETE"; + case METHOD_OPTIONS:return "OPTIONS"; + case METHOD_TRACE: return "TRACE"; + case METHOD_CONNECT:return "CONNECT"; + case METHOD_INVALID:return ""; + case METHOD_OTHER: return method_other; + default: return ""; + } +} + +http_method http_method_fromstring(const char* method) { + http_method methods[] = {METHOD_GET, METHOD_POST, METHOD_HEAD, METHOD_PUT, + METHOD_DELETE, METHOD_OPTIONS, METHOD_TRACE, + METHOD_CONNECT}; + + size_t count = sizeof(methods) / sizeof(http_method); + for(int i; i < count; i++) { + if (strcmp(http_method_getstring(methods[i],NULL), method) == 0) { + return methods[i]; + } + } + return METHOD_INVALID; +} + +http_request_line *http_request_line_new(http_method method, const char* other) { + http_request_line *req = calloc(1, sizeof(http_request_line)); + req->method = method; + if (req->method == METHOD_OTHER) { + req->method_other = calloc(strlen(other)+1, sizeof(char)); + strcpy(req->method_other, other); + } else { + req->method_other = NULL; + } + return req; +} +void http_request_line_delete(http_request_line *req) { + free(req->method_other); + free(req->uri); + free(req); +} + +http_response_line *http_response_line_new(uint16_t code) { + http_response_line *resp = calloc(1, sizeof(http_response_line)); + resp->code = code; + resp->version = HTTP11; + return resp; +} +char* http_response_line_get_message(http_response_line *resp) { + if (resp->custom_message != NULL) { + return resp->custom_message; + } + switch(resp->code) { + case 100: return "Continue"; + case 101: return "Switching Protocols"; + case 200: return "OK"; + case 201: return "Created"; + case 202: return "Accepted"; + case 203: return "Non-Authoritative Information"; + case 204: return "No Content"; + case 205: return "Reset Content"; + case 206: return "Partial Content"; + case 300: return "Multiple Choices"; + case 301: return "Moved Permanently"; + case 302: return "Found"; + case 303: return "See Other"; + case 304: return "Not Modified"; + case 305: return "Use Proxy"; + case 307: return "Temporary Redirect"; + case 400: return "Bad Request"; + case 401: return "Unauthorized"; + case 403: return "Forbidden"; + case 404: return "Not Found"; + case 405: return "Method Not Allowed"; + case 406: return "Not Acceptable"; + case 407: return "Proxy Authentication Required"; + case 408: return "Request Timeout"; + case 409: return "Conflict"; + case 410: return "Gone"; + case 411: return "Length Required"; + case 412: return "Precondition Failed"; + case 413: return "Request Entity Too Large"; + case 414: return "Request-URI Too Long"; + case 415: return "Unsupported Media Type"; + case 416: return "Requested Range Not Satisfiable"; + case 417: return "Expectation Failed"; + case 500: return "Internal Server Error"; + case 501: return "Not Implemented"; + case 502: return "Bad Gateway"; + case 503: return "Service Unavailable"; + case 504: return "Gateway Timeout"; + case 505: return "HTTP Version Not Supported"; + default: return ""; + } +} +void http_reponse_line_delete(http_response_line *resp) { + free(resp->custom_message); + free(resp); +} + +http_header *http_header_new(const char* name) { + http_header *header = calloc(1, sizeof(http_header)); + + header->name = calloc(strlen(name)+1, sizeof(char)); + strcpy(header->name, name); + + return header; +} +void http_header_append_content(http_header *header, const char* content) { + if (header->content == NULL) { + header->content = calloc(strlen(content)+1, sizeof(char)); + strcpy(header->content, content); + } else { + uint32_t newlen = strlen(header->content) + strlen(content) + 1; + header->content = realloc(header->content, newlen); + strcat(header->content, content); + } +} +void http_header_delete(http_header *header) { + free(header->name); + free(header->content); + free(header); +} + +http_request *http_request_new() { + http_request *req = calloc(1, sizeof(http_request)); + req->header_count = 0; + req->body = NULL; + 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*)); + req->headers[req->header_count-1] = header; +} +void http_request_apppend_body(http_request *req, const char* body) { + uint32_t bodylen = 0; + if (req->body != NULL) { + bodylen = strlen(req->body); + } + bodylen += strlen(body) + 1; + req->body = realloc(req->body, bodylen * sizeof(char)); + strcat(req->body, body); +} +void http_request_delete(http_request *req) { + http_request_line_delete(req->req); + for(int i =0; i < req->header_count; i++) { + http_header_delete(req->headers[i]); + } + free(req->headers); + free(req->body); + free(req); +} \ No newline at end of file diff --git a/src/http/http.h b/src/http/http.h new file mode 100644 index 0000000..1ca2ec7 --- /dev/null +++ b/src/http/http.h @@ -0,0 +1,78 @@ +/* + * File: http.h + * Author: sam + * + * Created on 18 July 2014, 14:15 + */ + +#ifndef HTTP_H +#define HTTP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "request.h" + + typedef enum http_method { + METHOD_GET, METHOD_POST, METHOD_HEAD, METHOD_PUT, + METHOD_DELETE, METHOD_OPTIONS, METHOD_TRACE, + METHOD_CONNECT, METHOD_OTHER, METHOD_INVALID + } http_method; + + typedef enum http_version { + HTTP10, HTTP11 + } http_version; + + typedef struct http_request_line { + http_method method; + char* method_other; + char* uri; + http_version version; + } http_request_line; + + typedef struct http_response_line { + http_version version; + uint16_t code; + char* custom_message; + } http_response_line; + + typedef struct http_header { + char* name; + char* content; + } http_header; + + typedef struct http_request { + http_request_line *req; + 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); + + http_request_line* http_request_line_new(http_method method, const char* other); + void http_request_line_delete(http_request_line *req); + + http_response_line* http_response_line_new(uint16_t code); + char* http_response_line_get_message(http_response_line *resp); + void http_reponse_line_delete(http_response_line *resp); + + http_header* http_header_new(const char* name); + void http_header_append_content(http_header *header, const char* content); + void http_header_delete(http_header *header); + + http_request* http_request_new(); + void http_request_add_header(http_request *req, http_header *header); + void http_request_apppend_body(http_request *req, const char* body); + void http_request_delete(http_request *req); + + +#ifdef __cplusplus +} +#endif + +#endif /* HTTP_H */ + diff --git a/src/http/request.c b/src/http/request.c new file mode 100644 index 0000000..aded04b --- /dev/null +++ b/src/http/request.c @@ -0,0 +1,6 @@ +#include +#include +#include +#include "http.h" + + diff --git a/src/http/request.h b/src/http/request.h new file mode 100644 index 0000000..bde8df1 --- /dev/null +++ b/src/http/request.h @@ -0,0 +1,25 @@ +/* + * File: request.h + * Author: sam + * + * Created on 18 July 2014, 14:43 + */ + +#ifndef REQUEST_H +#define REQUEST_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "http.h" + + + + +#ifdef __cplusplus +} +#endif + +#endif /* REQUEST_H */ + diff --git a/src/main.c b/src/main.c index 7c1c5de..26f0e13 100644 --- a/src/main.c +++ b/src/main.c @@ -28,8 +28,12 @@ int main(int argc, char** argv) { svr_listen(serverfd, 1234); while(1) { + uint32_t counter; + skt_elem *elem, *tmp; + //Accept new connections - while(svr_canaccept(serverfd)) { + LL_COUNT(connections, elem, counter); + while(counter < 100 && svr_canaccept(serverfd)) { skt_info *info = svr_accept(serverfd); if (info != NULL) { skt_elem* newconn = calloc(1, sizeof(skt_elem)); @@ -38,7 +42,6 @@ int main(int argc, char** argv) { } } - skt_elem *elem, *tmp; //Read from connections LL_FOREACH(connections, elem) { if (skt_canread(elem->info)) { @@ -63,16 +66,19 @@ int main(int argc, char** argv) { } time_t current = time(NULL); - time_t timeout = 5; + time_t timeout = 30; time_t maxlife = 500; //Close where needed LL_FOREACH(connections, elem) { if (current - elem->info->last_act > timeout) { - info("[#%lu %s] Timeout", elem->info->id, skt_addr(elem->info)); + info("[#%lu %s] Timeout", elem->info->id, skt_clientaddr(elem->info)); elem->info->close = true; } if (current - elem->info->time_opened> maxlife) { - info("[#%lu %s] Reached max life", elem->info->id, skt_addr(elem->info)); + info("[#%lu %s] Reached max life", elem->info->id, skt_clientaddr(elem->info)); + elem->info->close = true; + } + if (elem->info->close_afterwrite && utstring_len(elem->info->write) == 0) { elem->info->close = true; } if (elem->info->close == true) { diff --git a/src/socket.c b/src/socket.c index 4fe62c5..0939802 100644 --- a/src/socket.c +++ b/src/socket.c @@ -27,6 +27,7 @@ skt_info* skt_new(int fd) { utstring_new(skt->read); utstring_new(skt->write); skt->close = false; + skt->close_afterwrite = false; skt->closed = false; return skt; @@ -94,13 +95,13 @@ void skt_close(skt_info* skt) { if (skt->closed == true) { return; } - info("[#%lu %s] Closed", skt->id, skt_addr(skt)); + info("[#%lu %s] Closed", skt->id, skt_clientaddr(skt)); if (close(skt->fd) < 0) { warning("error closing socket", true); } skt->closed = true; } -char* skt_addr(skt_info *skt) { +char* skt_clientaddr(skt_info *skt) { char* address = inet_ntoa(skt->clientaddr->sin_addr); return address; } @@ -167,7 +168,7 @@ skt_info* svr_accept(int fd) { skt->clientaddr = clientaddr; skt->fd = clientfd; - info("[#%lu %s] New Connection", skt->id, skt_addr(skt)); + info("[#%lu %s] New Connection", skt->id, skt_clientaddr(skt)); return skt; diff --git a/src/socket.h b/src/socket.h index 5854672..e6cfb4b 100644 --- a/src/socket.h +++ b/src/socket.h @@ -29,6 +29,7 @@ extern "C" { UT_string *read; UT_string *write; bool close; + bool close_afterwrite; bool closed; struct sockaddr_in* clientaddr; }; @@ -46,7 +47,7 @@ extern "C" { uint32_t skt_read(skt_info *skt); uint32_t skt_write(skt_info *skt); void skt_close(skt_info *skt); - char* skt_addr(skt_info *skt); + char* skt_clientaddr(skt_info *skt); int svr_create(); void svr_listen(int fd, uint16_t port);