Commit 20af2baa6fa8fa10ca9620eaee7ca0499b35f959
1 parent
95d12d80
separated the server completely from the http processing
Showing
21 changed files
with
204 additions
and
113 deletions
| 1 | +2012-02-15 09:38:32 +0100 Georg Hopp | ||
| 2 | + | ||
| 3 | + * separated the server completely from the http processing (HEAD, master) | ||
| 4 | + | ||
| 1 | 2012-02-15 06:19:52 +0100 Georg Hopp | 5 | 2012-02-15 06:19:52 +0100 Georg Hopp |
| 2 | 6 | ||
| 3 | - * add subject/observer interface (HEAD, master) | 7 | + * add subject/observer interface |
| 4 | 8 | ||
| 5 | 2012-02-15 04:55:46 +0100 Georg Hopp | 9 | 2012-02-15 04:55:46 +0100 Georg Hopp |
| 6 | 10 | ||
| 7 | - * fix infinite busy loop in run (origin/master, origin/HEAD) | 11 | + * fix infinite busy loop in run |
| 8 | 12 | ||
| 9 | 2012-02-15 04:44:38 +0100 Georg Hopp | 13 | 2012-02-15 04:44:38 +0100 Georg Hopp |
| 10 | 14 |
| 1 | VERY BIG TODO: | 1 | VERY BIG TODO: |
| 2 | - give a contructor a way to fail, so that no object will be created at all | 2 | - give a contructor a way to fail, so that no object will be created at all |
| 3 | + | ||
| 4 | +- right now i will use long polling ajax calls when feedback from to the client | ||
| 5 | + is needed. In the long term this should be changed to websockets (ws). But | ||
| 6 | + right now ws specification is not final anyway. :) |
| @@ -34,7 +34,7 @@ CLASS(HttpRequestParser) { | @@ -34,7 +34,7 @@ CLASS(HttpRequestParser) { | ||
| 34 | }; | 34 | }; |
| 35 | 35 | ||
| 36 | size_t httpRequestParserRead(HttpRequestParser, int); | 36 | size_t httpRequestParserRead(HttpRequestParser, int); |
| 37 | -void httpRequestParserParse(HttpRequestParser); | 37 | +size_t httpRequestParserParse(HttpRequestParser); |
| 38 | void httpRequestParserGetBody(HttpRequestParser); | 38 | void httpRequestParserGetBody(HttpRequestParser); |
| 39 | 39 | ||
| 40 | void httpRequestParserGetRequestLine(HttpRequest, char *); | 40 | void httpRequestParserGetRequestLine(HttpRequest, char *); |
| @@ -29,7 +29,7 @@ CLASS(HttpResponseWriter) { | @@ -29,7 +29,7 @@ CLASS(HttpResponseWriter) { | ||
| 29 | HttpResponseState state; | 29 | HttpResponseState state; |
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| 32 | -HttpResponse httpResponseWriterWrite(HttpResponseWriter, int); | 32 | +size_t httpResponseWriterWrite(HttpResponseWriter, int); |
| 33 | 33 | ||
| 34 | #endif // __HTTP_RESPONSE_WRITER_H__ | 34 | #endif // __HTTP_RESPONSE_WRITER_H__ |
| 35 | 35 |
| 1 | #ifndef __HTTP_WORKER_H__ | 1 | #ifndef __HTTP_WORKER_H__ |
| 2 | #define __HTTP_WORKER_H__ | 2 | #define __HTTP_WORKER_H__ |
| 3 | 3 | ||
| 4 | +#include <sys/types.h> | ||
| 5 | + | ||
| 4 | #include "class.h" | 6 | #include "class.h" |
| 5 | #include "http/request/parser.h" | 7 | #include "http/request/parser.h" |
| 8 | +#include "http/response/writer.h" | ||
| 6 | 9 | ||
| 7 | CLASS(HttpWorker) { | 10 | CLASS(HttpWorker) { |
| 8 | - HttpRequestParser parser; | 11 | + HttpRequestParser parser; |
| 12 | + HttpResponseWriter writer; | ||
| 9 | }; | 13 | }; |
| 10 | 14 | ||
| 15 | +size_t httpWorkerProcess(HttpWorker, int); | ||
| 16 | +size_t httpWorkerWrite(HttpWorker, int); | ||
| 17 | + | ||
| 11 | #endif // __HTTP_WORKER_H__ | 18 | #endif // __HTTP_WORKER_H__ |
| 12 | 19 | ||
| 13 | // vim: set ts=4 sw=4: | 20 | // vim: set ts=4 sw=4: |
| @@ -27,13 +27,15 @@ CLASS(Server) { | @@ -27,13 +27,15 @@ CLASS(Server) { | ||
| 27 | Logger logger; | 27 | Logger logger; |
| 28 | Sock sock; | 28 | Sock sock; |
| 29 | 29 | ||
| 30 | + void * worker; | ||
| 31 | + | ||
| 30 | nfds_t nfds; | 32 | nfds_t nfds; |
| 31 | struct pollfd fds[POLL_FD_NSIZE]; | 33 | struct pollfd fds[POLL_FD_NSIZE]; |
| 32 | 34 | ||
| 33 | struct { | 35 | struct { |
| 34 | Sock sock; | 36 | Sock sock; |
| 35 | - void * reader; | ||
| 36 | - void * writer; | 37 | + |
| 38 | + void * worker; | ||
| 37 | 39 | ||
| 38 | char keep_alive; | 40 | char keep_alive; |
| 39 | } conns[POLL_FD_NSIZE]; | 41 | } conns[POLL_FD_NSIZE]; |
| @@ -15,6 +15,7 @@ RESP = http/response.c \ | @@ -15,6 +15,7 @@ RESP = http/response.c \ | ||
| 15 | http/response/404.c \ | 15 | http/response/404.c \ |
| 16 | http/response/image.c \ | 16 | http/response/image.c \ |
| 17 | http/response/me.c | 17 | http/response/me.c |
| 18 | +WORKER = http/worker.c http/worker/process.c http/worker/write.c | ||
| 18 | WRITER = http/response/writer.c http/response/writer/write.c | 19 | WRITER = http/response/writer.c http/response/writer/write.c |
| 19 | HEADER = http/header.c http/header/get.c http/header/add.c \ | 20 | HEADER = http/header.c http/header/get.c http/header/add.c \ |
| 20 | http/header/size_get.c http/header/to_string.c | 21 | http/header/size_get.c http/header/to_string.c |
| @@ -29,5 +30,6 @@ bin_PROGRAMS = testserver | @@ -29,5 +30,6 @@ bin_PROGRAMS = testserver | ||
| 29 | 30 | ||
| 30 | testserver_SOURCES = testserver.c \ | 31 | testserver_SOURCES = testserver.c \ |
| 31 | $(IFACE) $(CLASS) $(SOCKET) $(SERVER) $(LOGGER) $(MSG) $(REQ) \ | 32 | $(IFACE) $(CLASS) $(SOCKET) $(SERVER) $(LOGGER) $(MSG) $(REQ) \ |
| 32 | - $(WRITER) $(RESP) $(HEADER) $(PARSER) signalHandling.c daemonize.c | 33 | + $(WRITER) $(RESP) $(HEADER) $(PARSER) $(WORKER) \ |
| 34 | + signalHandling.c daemonize.c | ||
| 33 | testserver_CFLAGS = -Wall -I ../include/ | 35 | testserver_CFLAGS = -Wall -I ../include/ |
| @@ -59,8 +59,7 @@ _clone(void * _this, void * _base) | @@ -59,8 +59,7 @@ _clone(void * _this, void * _base) | ||
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | INIT_IFACE(Class, ctor, dtor, _clone); | 61 | INIT_IFACE(Class, ctor, dtor, _clone); |
| 62 | -INIT_IFACE(StreamReader, | ||
| 63 | - (fptr_streamReaderRead)httpRequestParserRead); | 62 | +INIT_IFACE(StreamReader, (fptr_streamReaderRead)httpRequestParserRead); |
| 64 | CREATE_CLASS(HttpRequestParser, NULL, IFACE(Class), IFACE(StreamReader)); | 63 | CREATE_CLASS(HttpRequestParser, NULL, IFACE(Class), IFACE(StreamReader)); |
| 65 | 64 | ||
| 66 | // vim: set ts=4 sw=4: | 65 | // vim: set ts=4 sw=4: |
| @@ -33,7 +33,7 @@ httpRequestSkip(char ** data) | @@ -33,7 +33,7 @@ httpRequestSkip(char ** data) | ||
| 33 | for (; 0 != **data && ! isalpha(**data); (*data)++); | 33 | for (; 0 != **data && ! isalpha(**data); (*data)++); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | -void | 36 | +size_t |
| 37 | httpRequestParserParse(HttpRequestParser this) | 37 | httpRequestParserParse(HttpRequestParser this) |
| 38 | { | 38 | { |
| 39 | char * line; | 39 | char * line; |
| @@ -111,6 +111,8 @@ httpRequestParserParse(HttpRequestParser this) | @@ -111,6 +111,8 @@ httpRequestParserParse(HttpRequestParser this) | ||
| 111 | break; | 111 | break; |
| 112 | } | 112 | } |
| 113 | } | 113 | } |
| 114 | + | ||
| 115 | + return this->request_queue->nmsgs; | ||
| 114 | } | 116 | } |
| 115 | 117 | ||
| 116 | // vim: set ts=4 sw=4: | 118 | // vim: set ts=4 sw=4: |
| @@ -7,10 +7,10 @@ | @@ -7,10 +7,10 @@ | ||
| 7 | size_t | 7 | size_t |
| 8 | httpRequestParserRead(HttpRequestParser this, int fd) | 8 | httpRequestParserRead(HttpRequestParser this, int fd) |
| 9 | { | 9 | { |
| 10 | - size_t remaining, chunks; | ||
| 11 | - char buffer[1024]; | 10 | + size_t remaining, chunks; |
| 11 | + char buffer[1024]; | ||
| 12 | 12 | ||
| 13 | - ssize_t size = read(fd, buffer, 1024); | 13 | + size_t size = read(fd, buffer, 1024); |
| 14 | 14 | ||
| 15 | if (0 < size) { | 15 | if (0 < size) { |
| 16 | remaining = this->buffer_used % HTTP_REQUEST_PARSER_READ_CHUNK; | 16 | remaining = this->buffer_used % HTTP_REQUEST_PARSER_READ_CHUNK; |
| @@ -35,7 +35,7 @@ httpRequestParserRead(HttpRequestParser this, int fd) | @@ -35,7 +35,7 @@ httpRequestParserRead(HttpRequestParser this, int fd) | ||
| 35 | this->buffer_used += size; | 35 | this->buffer_used += size; |
| 36 | this->buffer[this->buffer_used] = 0; | 36 | this->buffer[this->buffer_used] = 0; |
| 37 | 37 | ||
| 38 | - httpRequestParserParse(this); | 38 | + size = httpRequestParserParse(this); |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | return size; | 41 | return size; |
| @@ -38,8 +38,7 @@ _clone(void * _this, void * _base) | @@ -38,8 +38,7 @@ _clone(void * _this, void * _base) | ||
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | INIT_IFACE(Class, ctor, dtor, _clone); | 40 | INIT_IFACE(Class, ctor, dtor, _clone); |
| 41 | -INIT_IFACE(StreamWriter, | ||
| 42 | - (fptr_streamWriterWrite)httpResponseWriterWrite); | 41 | +INIT_IFACE(StreamWriter, (fptr_streamWriterWrite)httpResponseWriterWrite); |
| 43 | CREATE_CLASS(HttpResponseWriter, NULL, IFACE(Class), IFACE(StreamWriter)); | 42 | CREATE_CLASS(HttpResponseWriter, NULL, IFACE(Class), IFACE(StreamWriter)); |
| 44 | 43 | ||
| 45 | // vim: set ts=4 sw=4: | 44 | // vim: set ts=4 sw=4: |
| @@ -16,19 +16,21 @@ | @@ -16,19 +16,21 @@ | ||
| 16 | #define _PSIZE(x) (MAX((x),RESPONSE_WRITER_MAX_BUF)) | 16 | #define _PSIZE(x) (MAX((x),RESPONSE_WRITER_MAX_BUF)) |
| 17 | #define PSIZE _PSIZE(this->nheader+message->nbody) | 17 | #define PSIZE _PSIZE(this->nheader+message->nbody) |
| 18 | 18 | ||
| 19 | -HttpResponse | 19 | +size_t |
| 20 | httpResponseWriterWrite(HttpResponseWriter this, int fd) | 20 | httpResponseWriterWrite(HttpResponseWriter this, int fd) |
| 21 | { | 21 | { |
| 22 | - HttpMessageQueue respq = this->response_queue; | ||
| 23 | - HttpMessage message = (HttpMessage)this->cur_response; | ||
| 24 | - int cont = 1; | 22 | + HttpMessageQueue respq = this->response_queue; |
| 23 | + HttpMessage message = (HttpMessage)this->cur_response; | ||
| 24 | + size_t processed = (message)? 1 : 0; | ||
| 25 | + int cont = 1; | ||
| 25 | 26 | ||
| 26 | while (cont) { | 27 | while (cont) { |
| 27 | switch (this->state) { | 28 | switch (this->state) { |
| 28 | case HTTP_RESPONSE_GET: | 29 | case HTTP_RESPONSE_GET: |
| 29 | if (NULL == this->cur_response && 0 < respq->nmsgs) { | 30 | if (NULL == this->cur_response && 0 < respq->nmsgs) { |
| 30 | - message = respq->msgs[0]; | 31 | + message = respq->msgs[0]; |
| 31 | this->cur_response = (HttpResponse)message; | 32 | this->cur_response = (HttpResponse)message; |
| 33 | + processed++; | ||
| 32 | 34 | ||
| 33 | memmove(respq->msgs, | 35 | memmove(respq->msgs, |
| 34 | &(respq->msgs[1]), | 36 | &(respq->msgs[1]), |
| @@ -128,19 +130,25 @@ httpResponseWriterWrite(HttpResponseWriter this, int fd) | @@ -128,19 +130,25 @@ httpResponseWriterWrite(HttpResponseWriter this, int fd) | ||
| 128 | this->pstart = 0; | 130 | this->pstart = 0; |
| 129 | this->pend = 0; | 131 | this->pend = 0; |
| 130 | 132 | ||
| 131 | - if (httpMessageHasKeepAlive(message)) { | ||
| 132 | - delete(&this->cur_response); | ||
| 133 | - } | ||
| 134 | - else { | ||
| 135 | - cont = 0; | 133 | + if (! httpMessageHasKeepAlive(message)) { |
| 134 | + /** | ||
| 135 | + * if the message did not have the keep-alive feature | ||
| 136 | + * we don't care about further pipelined messages and | ||
| 137 | + * return the to caller with a 0 indicating that the | ||
| 138 | + * underlying connection should be closed. | ||
| 139 | + */ | ||
| 140 | + processed = 0; | ||
| 141 | + cont = 0; | ||
| 136 | } | 142 | } |
| 137 | 143 | ||
| 144 | + delete(&this->cur_response); | ||
| 145 | + | ||
| 138 | this->state = HTTP_RESPONSE_GET; | 146 | this->state = HTTP_RESPONSE_GET; |
| 139 | break; | 147 | break; |
| 140 | } | 148 | } |
| 141 | } | 149 | } |
| 142 | 150 | ||
| 143 | - return this->cur_response; | 151 | + return processed; |
| 144 | } | 152 | } |
| 145 | 153 | ||
| 146 | // vim: set ts=4 sw=4: | 154 | // vim: set ts=4 sw=4: |
src/http/worker.c
0 → 100644
| 1 | +#include <stdarg.h> | ||
| 2 | + | ||
| 3 | +#include "class.h" | ||
| 4 | +#include "http/worker.h" | ||
| 5 | +#include "http/request/parser.h" | ||
| 6 | +#include "http/response/writer.h" | ||
| 7 | + | ||
| 8 | +#include "interface/class.h" | ||
| 9 | +#include "interface/stream_reader.h" | ||
| 10 | +#include "interface/stream_writer.h" | ||
| 11 | + | ||
| 12 | +static | ||
| 13 | +void | ||
| 14 | +ctor(void * _this, va_list * params) | ||
| 15 | +{ | ||
| 16 | + HttpWorker this = _this; | ||
| 17 | + | ||
| 18 | + this->parser = new(HttpRequestParser); | ||
| 19 | + this->writer = new(HttpResponseWriter); | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +static | ||
| 23 | +void | ||
| 24 | +dtor(void * _this) | ||
| 25 | +{ | ||
| 26 | + HttpWorker this = _this; | ||
| 27 | + | ||
| 28 | + delete(&this->parser); | ||
| 29 | + delete(&this->writer); | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +static | ||
| 33 | +void | ||
| 34 | +_clone(void * _this, void * _base) | ||
| 35 | +{ | ||
| 36 | + /** | ||
| 37 | + * TODO: this actually simply creates a new worker | ||
| 38 | + * and ignores the base. Think about this. | ||
| 39 | + */ | ||
| 40 | + va_list foo; | ||
| 41 | + | ||
| 42 | + ctor(_this, &foo); | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | +INIT_IFACE(Class, ctor, dtor, _clone); | ||
| 46 | +INIT_IFACE(StreamReader, (fptr_streamReaderRead)httpWorkerProcess); | ||
| 47 | +INIT_IFACE(StreamWriter, (fptr_streamWriterWrite)httpWorkerWrite); | ||
| 48 | +CREATE_CLASS( | ||
| 49 | + HttpWorker, | ||
| 50 | + NULL, | ||
| 51 | + IFACE(Class), | ||
| 52 | + IFACE(StreamReader), | ||
| 53 | + IFACE(StreamWriter)); | ||
| 54 | + | ||
| 55 | +// vim: set ts=4 sw=4: |
src/http/worker/process.c
0 → 100644
| 1 | +#include "class.h" | ||
| 2 | +#include "interface/class.h" | ||
| 3 | + | ||
| 4 | +#include "http/worker.h" | ||
| 5 | +#include "http/request/parser.h" | ||
| 6 | + | ||
| 7 | +size_t | ||
| 8 | +httpWorkerProcess(HttpWorker this, int fd) | ||
| 9 | +{ | ||
| 10 | + size_t size; | ||
| 11 | + | ||
| 12 | + if (0 < (size = httpRequestParserRead(this->parser, fd))) { | ||
| 13 | + int i; | ||
| 14 | + HttpMessageQueue reqq = this->parser->request_queue; | ||
| 15 | + HttpMessageQueue respq = this->writer->response_queue; | ||
| 16 | + | ||
| 17 | + for (i=0; i<reqq->nmsgs; i++) { | ||
| 18 | + /** | ||
| 19 | + * @TODO: for now simply remove request and send not found. | ||
| 20 | + * Make this sane. | ||
| 21 | + */ | ||
| 22 | + HttpRequest request = (HttpRequest)(reqq->msgs[i]); | ||
| 23 | + HttpMessage response = NULL; | ||
| 24 | + | ||
| 25 | + if (0 == strcmp("GET", request->method) && | ||
| 26 | + 0 == strcmp("/me/", request->uri)) { | ||
| 27 | + response = (HttpMessage)httpResponseMe(); | ||
| 28 | + } | ||
| 29 | + else if (0 == strcmp("GET", request->method) && | ||
| 30 | + 0 == strcmp("/image/", request->uri)) { | ||
| 31 | + response = (HttpMessage)httpResponseImage(); | ||
| 32 | + } | ||
| 33 | + else { | ||
| 34 | + response = (HttpMessage)httpResponse404(); | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + if (httpMessageHasKeepAlive(reqq->msgs[i])) { | ||
| 38 | + httpHeaderAdd( | ||
| 39 | + &(response->header), | ||
| 40 | + new(HttpHeader, "Connection", "Keep-Alive")); | ||
| 41 | + } | ||
| 42 | + else { | ||
| 43 | + httpHeaderAdd( | ||
| 44 | + &(response->header), | ||
| 45 | + new(HttpHeader, "Connection", "Close")); | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + respq->msgs[(respq->nmsgs)++] = response; | ||
| 49 | + response = NULL; | ||
| 50 | + delete(&(reqq->msgs[i])); | ||
| 51 | + } | ||
| 52 | + | ||
| 53 | + reqq->nmsgs = 0; | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + return size; | ||
| 57 | +} | ||
| 58 | + | ||
| 59 | +// vim: set ts=4 sw=4: |
src/http/worker/write.c
0 → 100644
| @@ -20,6 +20,7 @@ ctor(void * _this, va_list * params) | @@ -20,6 +20,7 @@ ctor(void * _this, va_list * params) | ||
| 20 | int flags; | 20 | int flags; |
| 21 | 21 | ||
| 22 | this->logger = va_arg(* params, Logger); | 22 | this->logger = va_arg(* params, Logger); |
| 23 | + this->worker = va_arg(* params, void *); | ||
| 23 | port = va_arg(* params, int); | 24 | port = va_arg(* params, int); |
| 24 | backlog = va_arg(* params, unsigned int); | 25 | backlog = va_arg(* params, unsigned int); |
| 25 | 26 | ||
| @@ -45,8 +46,7 @@ dtor(void * _this) | @@ -45,8 +46,7 @@ dtor(void * _this) | ||
| 45 | for (i=0; i<this->nfds; i++) { | 46 | for (i=0; i<this->nfds; i++) { |
| 46 | if (this->sock->handle != (this->fds)[i].fd) { | 47 | if (this->sock->handle != (this->fds)[i].fd) { |
| 47 | delete(&(this->conns[(this->fds)[i].fd]).sock); | 48 | delete(&(this->conns[(this->fds)[i].fd]).sock); |
| 48 | - delete(&(this->conns[(this->fds)[i].fd]).reader); | ||
| 49 | - delete(&(this->conns[(this->fds)[i].fd]).writer); | 49 | + delete(&(this->conns[(this->fds)[i].fd]).worker); |
| 50 | } | 50 | } |
| 51 | } | 51 | } |
| 52 | 52 |
| @@ -10,8 +10,7 @@ serverCloseConn(Server this, unsigned int i) | @@ -10,8 +10,7 @@ serverCloseConn(Server this, unsigned int i) | ||
| 10 | int fd = (this->fds)[i].fd; | 10 | int fd = (this->fds)[i].fd; |
| 11 | 11 | ||
| 12 | delete(&((this->conns)[fd].sock)); | 12 | delete(&((this->conns)[fd].sock)); |
| 13 | - delete(&((this->conns)[fd].reader)); | ||
| 14 | - delete(&((this->conns)[fd].writer)); | 13 | + delete(&((this->conns)[fd].worker)); |
| 15 | 14 | ||
| 16 | (this->conns)[fd].keep_alive = 0; | 15 | (this->conns)[fd].keep_alive = 0; |
| 17 | 16 |
| @@ -12,8 +12,7 @@ serverHandleAccept(Server this) | @@ -12,8 +12,7 @@ serverHandleAccept(Server this) | ||
| 12 | (this->conns)[acc->handle].sock = acc; | 12 | (this->conns)[acc->handle].sock = acc; |
| 13 | 13 | ||
| 14 | //* clone reader | 14 | //* clone reader |
| 15 | - (this->conns)[acc->handle].reader = new(HttpRequestParser); | ||
| 16 | - (this->conns)[acc->handle].writer = new(HttpResponseWriter); | 15 | + (this->conns)[acc->handle].worker = clone(this->worker); |
| 17 | 16 | ||
| 18 | (this->fds)[this->nfds].fd = acc->handle; | 17 | (this->fds)[this->nfds].fd = acc->handle; |
| 19 | (this->fds)[this->nfds].events = POLLIN; | 18 | (this->fds)[this->nfds].events = POLLIN; |
| @@ -5,7 +5,7 @@ serverRead(Server this, unsigned int i) | @@ -5,7 +5,7 @@ serverRead(Server this, unsigned int i) | ||
| 5 | int fd = (this->fds)[i].fd; | 5 | int fd = (this->fds)[i].fd; |
| 6 | int size; | 6 | int size; |
| 7 | 7 | ||
| 8 | - if (NULL == (this->conns)[fd].reader) { | 8 | + if (NULL == (this->conns)[fd].worker) { |
| 9 | loggerLog( | 9 | loggerLog( |
| 10 | this->logger, | 10 | this->logger, |
| 11 | LOGGER_INFO, | 11 | LOGGER_INFO, |
| @@ -13,7 +13,7 @@ serverRead(Server this, unsigned int i) | @@ -13,7 +13,7 @@ serverRead(Server this, unsigned int i) | ||
| 13 | return -1; | 13 | return -1; |
| 14 | } | 14 | } |
| 15 | 15 | ||
| 16 | - switch ((size = streamReaderRead((this->conns)[fd].reader, fd))) { | 16 | + switch ((size = streamReaderRead((this->conns)[fd].worker, fd))) { |
| 17 | case 0: | 17 | case 0: |
| 18 | /* | 18 | /* |
| 19 | * normal close: write remaining data | 19 | * normal close: write remaining data |
| @@ -19,14 +19,6 @@ | @@ -19,14 +19,6 @@ | ||
| 19 | #include "interface/stream_writer.h" | 19 | #include "interface/stream_writer.h" |
| 20 | #include "interface/logger.h" | 20 | #include "interface/logger.h" |
| 21 | 21 | ||
| 22 | -//* @TODO: to be removed | ||
| 23 | -#include "http/request.h" | ||
| 24 | -#include "http/request/parser.h" | ||
| 25 | -#include "http/message/queue.h" | ||
| 26 | -#include "http/response.h" | ||
| 27 | -#include "http/response/writer.h" | ||
| 28 | -//* until here | ||
| 29 | - | ||
| 30 | #undef MAX | 22 | #undef MAX |
| 31 | #define MAX(x,y) ((x) > (y) ? (x) : (y)) | 23 | #define MAX(x,y) ((x) > (y) ? (x) : (y)) |
| 32 | 24 | ||
| @@ -94,63 +86,17 @@ serverRun(Server this) | @@ -94,63 +86,17 @@ serverRun(Server this) | ||
| 94 | */ | 86 | */ |
| 95 | else { | 87 | else { |
| 96 | nreads--; | 88 | nreads--; |
| 97 | - /** | ||
| 98 | - * do some other processing | ||
| 99 | - * @TODO: actually this will hard assume that our stream reader | ||
| 100 | - * is a http parser and it has its queue...think about more | ||
| 101 | - * generalizing here. | ||
| 102 | - */ | ||
| 103 | - int size; | ||
| 104 | - | ||
| 105 | - if (0 >= (size=serverRead(this, i))) { | ||
| 106 | - serverCloseConn(this, i); | ||
| 107 | - } | ||
| 108 | - else { | ||
| 109 | - int j; | ||
| 110 | - HttpMessageQueue reqq = ((HttpRequestParser) \ | ||
| 111 | - (this->conns)[fd].reader)->request_queue; | ||
| 112 | - HttpMessageQueue respq = ((HttpResponseWriter) \ | ||
| 113 | - (this->conns)[fd].writer)->response_queue; | ||
| 114 | - | ||
| 115 | - for (j=0; j<reqq->nmsgs; j++) { | ||
| 116 | - /** | ||
| 117 | - * @TODO: for now simply remove request and send not found. | ||
| 118 | - * Make this sane. | ||
| 119 | - */ | ||
| 120 | - HttpRequest request = (HttpRequest)(reqq->msgs[j]); | ||
| 121 | - HttpMessage response = NULL; | ||
| 122 | - | ||
| 123 | - if (0 == strcmp("GET", request->method) && | ||
| 124 | - 0 == strcmp("/me/", request->uri)) { | ||
| 125 | - response = (HttpMessage)httpResponseMe(); | ||
| 126 | - } | ||
| 127 | - else if (0 == strcmp("GET", request->method) && | ||
| 128 | - 0 == strcmp("/image/", request->uri)) { | ||
| 129 | - response = (HttpMessage)httpResponseImage(); | ||
| 130 | - } | ||
| 131 | - else { | ||
| 132 | - response = (HttpMessage)httpResponse404(); | ||
| 133 | - } | ||
| 134 | - | ||
| 135 | - if (httpMessageHasKeepAlive(reqq->msgs[j])) { | ||
| 136 | - httpHeaderAdd( | ||
| 137 | - &(response->header), | ||
| 138 | - new(HttpHeader, "Connection", "Keep-Alive")); | ||
| 139 | - } | ||
| 140 | - else { | ||
| 141 | - httpHeaderAdd( | ||
| 142 | - &(response->header), | ||
| 143 | - new(HttpHeader, "Connection", "Close")); | ||
| 144 | - } | ||
| 145 | - | ||
| 146 | - respq->msgs[(respq->nmsgs)++] = response; | ||
| 147 | - response = NULL; | ||
| 148 | - delete(&(reqq->msgs[j])); | ||
| 149 | 89 | ||
| 150 | - (this->fds)[i].events |= POLLOUT; | ||
| 151 | - } | 90 | + switch (serverRead(this, i)) { |
| 91 | + case -1: | ||
| 92 | + serverCloseConn(this, i); | ||
| 93 | + break; | ||
| 94 | + | ||
| 95 | + case 0: | ||
| 96 | + break; | ||
| 152 | 97 | ||
| 153 | - reqq->nmsgs = 0; | 98 | + default: |
| 99 | + (this->fds)[i].events |= POLLOUT; | ||
| 154 | } | 100 | } |
| 155 | } | 101 | } |
| 156 | } | 102 | } |
| @@ -159,22 +105,14 @@ serverRun(Server this) | @@ -159,22 +105,14 @@ serverRun(Server this) | ||
| 159 | * handle writes | 105 | * handle writes |
| 160 | */ | 106 | */ |
| 161 | if (0 != ((this->fds)[i].revents & POLLOUT) && 0 < nwrites) { | 107 | if (0 != ((this->fds)[i].revents & POLLOUT) && 0 < nwrites) { |
| 162 | - HttpResponseWriter writer = | ||
| 163 | - (HttpResponseWriter)(this->conns)[fd].writer; | ||
| 164 | - HttpMessage message; | ||
| 165 | - | ||
| 166 | events--; | 108 | events--; |
| 167 | nwrites--; | 109 | nwrites--; |
| 168 | 110 | ||
| 169 | - message = (HttpMessage)streamWriterWrite(writer, fd); | ||
| 170 | - | ||
| 171 | - if (NULL == message) { | ||
| 172 | - (this->fds)[i].events &= ~POLLOUT; | ||
| 173 | - } | ||
| 174 | - else { | ||
| 175 | - delete(&message); | 111 | + if (0 >= streamWriterWrite((this->conns)[fd].worker, fd)) { |
| 176 | serverCloseConn(this, i); | 112 | serverCloseConn(this, i); |
| 177 | } | 113 | } |
| 114 | + | ||
| 115 | + (this->fds)[i].events &= ~POLLOUT; | ||
| 178 | } | 116 | } |
| 179 | } | 117 | } |
| 180 | } | 118 | } |
| @@ -7,7 +7,7 @@ | @@ -7,7 +7,7 @@ | ||
| 7 | 7 | ||
| 8 | #include "server.h" | 8 | #include "server.h" |
| 9 | #include "logger.h" | 9 | #include "logger.h" |
| 10 | -#include "http/request/parser.h" | 10 | +#include "http/worker.h" |
| 11 | 11 | ||
| 12 | #include "signalHandling.h" | 12 | #include "signalHandling.h" |
| 13 | 13 | ||
| @@ -18,8 +18,9 @@ void daemonize(void); | @@ -18,8 +18,9 @@ void daemonize(void); | ||
| 18 | int | 18 | int |
| 19 | main() | 19 | main() |
| 20 | { | 20 | { |
| 21 | - Logger logger = new(LoggerSyslog, LOGGER_ERR); | ||
| 22 | - Server server = new(Server, logger, 11212, SOMAXCONN); | 21 | + Logger logger = new(LoggerSyslog, LOGGER_ERR); |
| 22 | + HttpWorker worker = new(HttpWorker); | ||
| 23 | + Server server = new(Server, logger, worker, 11212, SOMAXCONN); | ||
| 23 | 24 | ||
| 24 | struct rlimit limit = {RLIM_INFINITY, RLIM_INFINITY}; | 25 | struct rlimit limit = {RLIM_INFINITY, RLIM_INFINITY}; |
| 25 | setrlimit(RLIMIT_CPU, &limit); | 26 | setrlimit(RLIMIT_CPU, &limit); |
| @@ -29,6 +30,7 @@ main() | @@ -29,6 +30,7 @@ main() | ||
| 29 | serverRun(server); | 30 | serverRun(server); |
| 30 | 31 | ||
| 31 | delete(&server); | 32 | delete(&server); |
| 33 | + delete(&worker); | ||
| 32 | delete(&logger); | 34 | delete(&logger); |
| 33 | 35 | ||
| 34 | return 0; | 36 | return 0; |
Please
register
or
login
to post a comment