diff --git a/include/http/request.h b/include/http/request.h new file mode 100644 index 0000000..acbfa97 --- /dev/null +++ b/include/http/request.h @@ -0,0 +1,23 @@ +#ifndef __HTTP_REQUEST_H__ +#define __HTTP_REQUEST_H__ + +#include "cclass.h" + +CLASS(HTTP_REQUEST) { + char * http_version; + char * uri; + char * method; + + struct { + char * name; + char * value; + } header[128]; + + char * body; + + unsigned char done; +}; + +#endif /* __HTTP_REQUEST_H__ */ + +// vim: set ts=4 sw=4: diff --git a/include/http/request_parser.h b/include/http/request_parser.h new file mode 100644 index 0000000..7d84462 --- /dev/null +++ b/include/http/request_parser.h @@ -0,0 +1,32 @@ +#ifndef __HTTP_REQUEST_PARSER_H__ +#define __HTTP_REQUEST_PARSER_H__ + +#include "cclass.h" +#include "server.h" +#include "http/request.h" +#include "http/request_queue.h" + +#define HTTP_REQUEST_PARSER_READ_CHUNK 1024 + +#define HTTP_REQUEST_PARSER_START 0 +#define HTTP_REQUEST_PARSER_REQUEST_LINE_DONE 1 +#define HTTP_REQUEST_PARSER_HEADERS_DONE 2 +#define HTTP_REQUEST_PARSER_DONE 3 + + +CLASS(HTTP_REQUEST_PARSER) { + server_read_hook get_data; + + char * buffer; + size_t buffer_used; + + HTTP_REQUEST_QUEUE request_queue; + + unsigned char state; +}; + +void http_request_parser_parse(const char * buffer, size_t size); + +#endif /* __HTTP_REQUEST_PARSER_H__ */ + +// vim: set ts=4 sw=4: diff --git a/include/http/request_queue.h b/include/http/request_queue.h new file mode 100644 index 0000000..7f256da --- /dev/null +++ b/include/http/request_queue.h @@ -0,0 +1,17 @@ +#ifndef __HTTP_REQUEST_QUEUE_H__ +#define __HTTP_REQUEST_QUEUE_H__ + +#include "cclass.h" +#include "http/request.h" + +#define HTTP_REQUEST_QUEUE_MAX 1024 + + +CLASS(HTTP_REQUEST_QUEUE) { + REQUEST requests[HTTP_REQUEST_QUEUE_MAX]; + size_t nrequests; +} + +#endif /* __HTTP_REQUEST_QUEUE_H__ */ + +// vim: set ts=4 sw=4: diff --git a/src/http/request.c b/src/http/request.c new file mode 100644 index 0000000..aa7b218 --- /dev/null +++ b/src/http/request.c @@ -0,0 +1,38 @@ +#include + +#include "cclass.h" +#include "http/request.h" + +INIT_CLASS(HTTP_REQUEST); + +static void +_free(void ** data) +{ + if (NULL != *data) { + free(*data); + } +} + +__construct(LOGGER) {} + +__destruct(LOGGER) +{ + int i; + + _free(&(this->http_version)); + _free(&(this->uri)); + _free(&(this->method)); + + for (i=0; i<128; i++) { + _free(&((this->header)[i].name)); + _free(&((this->header)[i].value)); + } + + _free(&(this->body)); +} + +__jsonConst(LOGGER) {} +__toJson(LOGGER) {} +__clear(LOGGER) {} + +// vim: set ts=4 sw=4: diff --git a/src/http/request_parser.c b/src/http/request_parser.c new file mode 100644 index 0000000..c3c4c08 --- /dev/null +++ b/src/http/request_parser.c @@ -0,0 +1,51 @@ +#include + +#include "cclass.h" +#include "http/request.h" +#include "http/request_parser.h" + + +INIT_CLASS(HTTP_REQUEST_PARSER); + + +__construct(LOGGER) +{ + this->request_queue = va_arg(*params, HTTP_REQUEST_QUEUE); + + this->buffer = malloc(HTTP_REQUEST_PARSER_READ_CHUNK); +} + +__destruct(LOGGER) +{ + free(this->buffer); +} + +__jsonConst(LOGGER) {} +__toJson(LOGGER) {} +__clear(LOGGER) {} + + +static void +get_data(HTTP_REQUEST_PARSER this, const char * data, size_t size) +{ + size_t remaining, chunks; + + remaining = this->buffer_used % HTTP_REQUEST_PARSER_READ_CHUNK; + chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK; + + chunks = (0 == remaining) ? chunks++ : chunks; + + if (size > remaining) { + this->buffer = + realloc(this->buffer, chunks * HTTP_REQUEST_PARSER_READ_CHUNK); + } + + memcpy(this->buffer + this->buffer_used, data, size); + this->buffer_used += size; +} + +void http_request_parser_parse(const char * data, size_t size) +{ +} + +// vim: set ts=4 sw=4: diff --git a/src/logger/add.c b/src/logger/add.c new file mode 100644 index 0000000..474fecc --- /dev/null +++ b/src/logger/add.c @@ -0,0 +1,11 @@ +#include "logger.h" + +void +logger_add(LOGGER this, logger_logfnct logfunc) { + if (this->logfncts_count < MAX_LOG_FNCTS) { + this->logfncts[this->logfncts_count] = logfunc; + this->logfncts_count++; + } +} + +// vim: set ts=4 sw=4: diff --git a/src/logger/log.c b/src/logger/log.c new file mode 100644 index 0000000..f4c5dfa --- /dev/null +++ b/src/logger/log.c @@ -0,0 +1,30 @@ +#define _ISOC99_SOURCE + +#include +#include + +#include "logger.h" + +void +logger_log(LOGGER this, int level, const char * message, ...) { + va_list args; + char buffer[1025]; + logger_logfnct * logfnct; + + int maxBuf = sizeof(buffer)/sizeof(buffer[0]); + + memset(buffer, 0, maxBuf); + + va_start(args, message); + vsnprintf(buffer, 1024, message, args); + va_end(args); + + logfnct = this->logfncts; + + while (NULL != *logfnct) { + (*logfnct)(level, buffer); + logfnct++; + } +} + +// vim: set ts=4 sw=4: diff --git a/src/logger/syslog.c b/src/logger/syslog.c new file mode 100644 index 0000000..0299fa8 --- /dev/null +++ b/src/logger/syslog.c @@ -0,0 +1,20 @@ +#include + +const int priority[] = { + LOG_USER | LOG_EMERG, + LOG_USER | LOG_ALERT, + LOG_USER | LOG_CRIT, + LOG_USER | LOG_ERR, + LOG_USER | LOG_WARNING, + LOG_USER | LOG_NOTICE, + LOG_USER | LOG_INFO, + LOG_USER | LOG_DEBUG +}; + +void +logger_syslog(int level, const char * msg) +{ + syslog(priority[level], "%s", msg); +} + +// vim: set ts=4 sw=4: