From 6550e381f0270cd53cbfcd36359119e876b33d50 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Wed, 15 Feb 2012 12:17:00 +0100 Subject: [PATCH] now the separated http worker works. Changed some size_t to ssize_t as i use -1 and -2 es error indicator in my server and fixed caculation of remainig buffer size in reader --- ChangeLog | 6 +++++- include/http/request/parser.h | 10 +++++----- include/http/response/writer.h | 2 +- include/http/worker.h | 4 ++-- include/interface/stream_reader.h | 4 ++-- include/interface/stream_writer.h | 4 ++-- src/http/request/parser/parse.c | 12 +++++++++--- src/http/request/parser/read.c | 8 ++++++-- src/http/response/writer/write.c | 4 ++-- src/http/worker/process.c | 4 ++-- src/http/worker/write.c | 2 +- src/interface/stream_reader.c | 4 ++-- src/interface/stream_writer.c | 4 ++-- src/server/read.c | 14 ++++++++------ src/server/run.c | 1 + 15 files changed, 50 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1eeec15..3200e87 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ +2012-02-15 12:17:00 +0100 Georg Hopp + + * now the separated http worker works. Changed some size_t to ssize_t as i use -1 and -2 es error indicator in my server and fixed caculation of remainig buffer size in reader (HEAD, master) + 2012-02-15 09:38:32 +0100 Georg Hopp - * separated the server completely from the http processing (HEAD, master) + * separated the server completely from the http processing 2012-02-15 06:19:52 +0100 Georg Hopp diff --git a/include/http/request/parser.h b/include/http/request/parser.h index 09b5d11..8f4f67b 100644 --- a/include/http/request/parser.h +++ b/include/http/request/parser.h @@ -33,12 +33,12 @@ CLASS(HttpRequestParser) { HttpRequestState state; }; -size_t httpRequestParserRead(HttpRequestParser, int); -size_t httpRequestParserParse(HttpRequestParser); -void httpRequestParserGetBody(HttpRequestParser); +ssize_t httpRequestParserRead(HttpRequestParser, int); +ssize_t httpRequestParserParse(HttpRequestParser); +void httpRequestParserGetBody(HttpRequestParser); -void httpRequestParserGetRequestLine(HttpRequest, char *); -void httpRequestParserGetHeader(HttpRequest, char *); +void httpRequestParserGetRequestLine(HttpRequest, char *); +void httpRequestParserGetHeader(HttpRequest, char *); #endif /* __HTTP_REQUEST_PARSER_H__ */ diff --git a/include/http/response/writer.h b/include/http/response/writer.h index ac9e300..452745b 100644 --- a/include/http/response/writer.h +++ b/include/http/response/writer.h @@ -29,7 +29,7 @@ CLASS(HttpResponseWriter) { HttpResponseState state; }; -size_t httpResponseWriterWrite(HttpResponseWriter, int); +ssize_t httpResponseWriterWrite(HttpResponseWriter, int); #endif // __HTTP_RESPONSE_WRITER_H__ diff --git a/include/http/worker.h b/include/http/worker.h index 59703df..2f23884 100644 --- a/include/http/worker.h +++ b/include/http/worker.h @@ -12,8 +12,8 @@ CLASS(HttpWorker) { HttpResponseWriter writer; }; -size_t httpWorkerProcess(HttpWorker, int); -size_t httpWorkerWrite(HttpWorker, int); +ssize_t httpWorkerProcess(HttpWorker, int); +ssize_t httpWorkerWrite(HttpWorker, int); #endif // __HTTP_WORKER_H__ diff --git a/include/interface/stream_reader.h b/include/interface/stream_reader.h index 706d3ae..cc959f9 100644 --- a/include/interface/stream_reader.h +++ b/include/interface/stream_reader.h @@ -3,7 +3,7 @@ #include -typedef size_t (* fptr_streamReaderRead)(void *, int fd); +typedef ssize_t (* fptr_streamReaderRead)(void *, int fd); extern const struct interface i_StreamReader; @@ -12,7 +12,7 @@ struct i_StreamReader { fptr_streamReaderRead read; }; -extern size_t streamReaderRead(void *, int fd); +extern ssize_t streamReaderRead(void *, int fd); #endif // __STREAM_READER_H__ diff --git a/include/interface/stream_writer.h b/include/interface/stream_writer.h index 4018707..472971b 100644 --- a/include/interface/stream_writer.h +++ b/include/interface/stream_writer.h @@ -3,7 +3,7 @@ #include -typedef size_t (* fptr_streamWriterWrite)(void *, int fd); +typedef ssize_t (* fptr_streamWriterWrite)(void *, int fd); extern const struct interface i_StreamWriter; @@ -12,7 +12,7 @@ struct i_StreamWriter { fptr_streamWriterWrite write; }; -extern size_t streamWriterWrite(void *, int fd); +extern ssize_t streamWriterWrite(void *, int fd); #endif // __STREAM_WRITER_H__ diff --git a/src/http/request/parser/parse.c b/src/http/request/parser/parse.c index 075fcd0..ff86a23 100644 --- a/src/http/request/parser/parse.c +++ b/src/http/request/parser/parse.c @@ -33,11 +33,12 @@ httpRequestSkip(char ** data) for (; 0 != **data && ! isalpha(**data); (*data)++); } -size_t +ssize_t httpRequestParserParse(HttpRequestParser this) { - char * line; - int cont = 1; + char * line; + int cont = 1; + ssize_t ret = this->request_queue->nmsgs; while (cont) { switch(this->state) { @@ -84,6 +85,11 @@ httpRequestParserParse(HttpRequestParser this) */ this->request_queue->msgs[(this->request_queue->nmsgs)++] = (HttpMessage)this->cur_request; + + if (! httpMessageHasKeepAlive((HttpMessage)this->cur_request)) { + ret = -2; + } + this->cur_request = NULL; /** diff --git a/src/http/request/parser/read.c b/src/http/request/parser/read.c index 521a3a2..1a1d493 100644 --- a/src/http/request/parser/read.c +++ b/src/http/request/parser/read.c @@ -4,16 +4,17 @@ #include "http/request/parser.h" -size_t +ssize_t httpRequestParserRead(HttpRequestParser this, int fd) { size_t remaining, chunks; char buffer[1024]; - size_t size = read(fd, buffer, 1024); + ssize_t size = read(fd, buffer, 1024); if (0 < size) { remaining = this->buffer_used % HTTP_REQUEST_PARSER_READ_CHUNK; + remaining = HTTP_REQUEST_PARSER_READ_CHUNK - remaining; chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK; /** @@ -37,6 +38,9 @@ httpRequestParserRead(HttpRequestParser this, int fd) size = httpRequestParserParse(this); } + else { + size = (0 == size)? -2 : size; + } return size; } diff --git a/src/http/response/writer/write.c b/src/http/response/writer/write.c index 8f27400..eddbf3a 100644 --- a/src/http/response/writer/write.c +++ b/src/http/response/writer/write.c @@ -16,12 +16,12 @@ #define _PSIZE(x) (MAX((x),RESPONSE_WRITER_MAX_BUF)) #define PSIZE _PSIZE(this->nheader+message->nbody) -size_t +ssize_t httpResponseWriterWrite(HttpResponseWriter this, int fd) { HttpMessageQueue respq = this->response_queue; HttpMessage message = (HttpMessage)this->cur_response; - size_t processed = (message)? 1 : 0; + ssize_t processed = (message)? 1 : 0; int cont = 1; while (cont) { diff --git a/src/http/worker/process.c b/src/http/worker/process.c index 43dd667..949b4d5 100644 --- a/src/http/worker/process.c +++ b/src/http/worker/process.c @@ -4,10 +4,10 @@ #include "http/worker.h" #include "http/request/parser.h" -size_t +ssize_t httpWorkerProcess(HttpWorker this, int fd) { - size_t size; + ssize_t size; if (0 < (size = httpRequestParserRead(this->parser, fd))) { int i; diff --git a/src/http/worker/write.c b/src/http/worker/write.c index 387b14f..70a8d2c 100644 --- a/src/http/worker/write.c +++ b/src/http/worker/write.c @@ -3,7 +3,7 @@ #include "http/worker.h" #include "http/response/writer.h" -size_t +ssize_t httpWorkerWrite(HttpWorker this, int fd) { return httpResponseWriterWrite(this->writer, fd); diff --git a/src/interface/stream_reader.c b/src/interface/stream_reader.c index 8bd5e7c..6aa06f2 100644 --- a/src/interface/stream_reader.c +++ b/src/interface/stream_reader.c @@ -6,10 +6,10 @@ const struct interface i_StreamReader = { 1 }; -size_t +ssize_t streamReaderRead(void * object, int fd) { - size_t ret; + ssize_t ret; RETCALL(object, StreamReader, read, ret, fd); diff --git a/src/interface/stream_writer.c b/src/interface/stream_writer.c index 501afb2..f4860c6 100644 --- a/src/interface/stream_writer.c +++ b/src/interface/stream_writer.c @@ -6,10 +6,10 @@ const struct interface i_StreamWriter = { 1 }; -size_t +ssize_t streamWriterWrite(void * object, int fd) { - size_t ret; + ssize_t ret; RETCALL(object, StreamWriter, write, ret, fd); diff --git a/src/server/read.c b/src/server/read.c index 199f6f2..eee05c6 100644 --- a/src/server/read.c +++ b/src/server/read.c @@ -1,9 +1,9 @@ static -int +ssize_t serverRead(Server this, unsigned int i) { - int fd = (this->fds)[i].fd; - int size; + int fd = (this->fds)[i].fd; + ssize_t size; if (NULL == (this->conns)[fd].worker) { loggerLog( @@ -14,10 +14,12 @@ serverRead(Server this, unsigned int i) } switch ((size = streamReaderRead((this->conns)[fd].worker, fd))) { - case 0: + case -2: /* - * normal close: write remaining data - * @TODO: actually we have no remaining data here.... + * normal close: this must be mapped to -2 within the + * underlying read call. Done now in httpRequestParserRead + * @TODO: make sure all pending writes will be done before + * close. */ /* DROP-THROUGH */ diff --git a/src/server/run.c b/src/server/run.c index 23f7b44..4c95d30 100644 --- a/src/server/run.c +++ b/src/server/run.c @@ -88,6 +88,7 @@ serverRun(Server this) nreads--; switch (serverRead(this, i)) { + case -2: case -1: serverCloseConn(this, i); break;