#include #include #include #include #include #include #include "class.h" #include "http/request_parser.h" #include "interface/class.h" #include "interface/stream_reader.h" //#include "http/request.h" //#include "http/request_queue.h" static void httpRequestParserParse(char * data, size_t * size); static void ctor(void * _this, va_list * params) { HttpRequestParser this = _this; //this->request_queue = va_arg(*params, HttpRequestQueue); this->buffer = malloc(HTTP_REQUEST_PARSER_READ_CHUNK); } static void dtor(void * _this) { HttpRequestParser this = _this; free(this->buffer); } static void _clone(void * _this, void * _base) { HttpRequestParser this = _this; HttpRequestParser base = _base; size_t chunks; //this->request_queue = base->request_queue; this->buffer_used = base->buffer_used; chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK; chunks++; this->buffer = malloc(chunks * HTTP_REQUEST_PARSER_READ_CHUNK); memcpy(this->buffer, base->buffer, this->buffer_used); } static size_t get_data(void * _this, int fd) { HttpRequestParser this = _this; size_t remaining, chunks; char buffer[1024]; size_t size = read(fd, buffer, 1024); if (0 < size) { remaining = this->buffer_used % HTTP_REQUEST_PARSER_READ_CHUNK; chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK; /** * because a division always rounds down * chunks holds exactly the currently allocated chunks if * remaining equals 0 but there is no space left. * Else chunks holds the actually allocated amount of chunks * minus 1. * For this reason chunks always has to be increased by 1. */ chunks++; if (size > remaining) { this->buffer = realloc(this->buffer, chunks * HTTP_REQUEST_PARSER_READ_CHUNK); } memcpy(this->buffer + this->buffer_used, buffer, size); this->buffer_used += size; httpRequestParserParse(this->buffer, &this->buffer_used); } return size; } INIT_IFACE(Class, ctor, dtor, _clone); INIT_IFACE(StreamReader, get_data); CREATE_CLASS(HttpRequestParser, NULL, IFACE(Class), IFACE(StreamReader)); static void httpRequestParserParse(char * data, size_t * size) { data[*size] = 0; printf("%s", data); *size = 0; } // vim: set ts=4 sw=4: