From 983c93390885090d8ab933c217e836a465d67753 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Sat, 11 Feb 2012 12:47:01 +0100 Subject: [PATCH] fix seaks and hangs after adding response object (mostly not related with the response object but how i integated it into serverRun --- ChangeLog | 8 ++++++-- src/server.c | 16 ++++++++-------- src/server/close_conn.c | 5 ++++- src/server/read.c | 8 +++++--- src/server/run.c | 12 ++++++++---- src/testserver.c | 4 +--- 6 files changed, 32 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2bfe4ae..ae45d5c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,14 @@ +2012-02-11 12:47:01 +0100 Georg Hopp + + * fix seaks and hangs after adding response object (mostly not related with the response object but how i integated it into serverRun (HEAD, master) + 2012-02-10 19:57:57 +0100 Georg Hopp - * started a response handler and changed serverRun to use it for its response (HEAD, master) + * started a response handler and changed serverRun to use it for its response (origin/master, origin/HEAD) 2012-02-10 12:42:04 +0100 Georg Hopp - * fixed bug at server destructor (origin/master, origin/HEAD) + * fixed bug at server destructor 2012-02-10 09:59:41 +0100 Georg Hopp diff --git a/src/server.c b/src/server.c index 7b73cd4..6fda105 100644 --- a/src/server.c +++ b/src/server.c @@ -36,14 +36,14 @@ dtor(void * _this) Server this = _this; int i; - for (i=1; infds; i++) { - /* - * @TODO do some finalization...buffer handling...etc. - */ - delete(&(this->conns[(this->fds)[i].fd]).sock); - delete(&(this->conns[(this->fds)[i].fd]).reader); - if (this->conns[(this->fds)[i].fd].wbuf) - free(this->conns[(this->fds)[i].fd].wbuf); + for (i=0; infds; i++) { + if (this->sock->handle != (this->fds)[i].fd) { + delete(&(this->conns[(this->fds)[i].fd]).sock); + delete(&(this->conns[(this->fds)[i].fd]).reader); + + if (this->conns[(this->fds)[i].fd].wbuf) + free(this->conns[(this->fds)[i].fd].wbuf); + } } delete(&this->sock); diff --git a/src/server/close_conn.c b/src/server/close_conn.c index 2f90e15..9307da6 100644 --- a/src/server/close_conn.c +++ b/src/server/close_conn.c @@ -11,7 +11,10 @@ serverCloseConn(Server this, unsigned int i) delete(&((this->conns)[fd].sock)); delete(&((this->conns)[fd].reader)); - memset((this->conns)[fd].wbuf, 0, strlen((this->conns)[fd].wbuf)); + if ((this->conns)[fd].wbuf != NULL) { + free((this->conns)[fd].wbuf); + (this->conns)[fd].wbuf = NULL; + } (this->conns)[fd].keep_alive = 0; (this->fds)[i].events = 0; diff --git a/src/server/read.c b/src/server/read.c index 83ef47a..bdb4738 100644 --- a/src/server/read.c +++ b/src/server/read.c @@ -10,7 +10,7 @@ serverRead(Server this, unsigned int i) this->logger, LOGGER_INFO, "initialization error: NULL reader"); - serverCloseConn(this, i); + return -1; } switch ((size = streamReaderRead((this->conns)[fd].reader, fd))) { @@ -25,8 +25,10 @@ serverRead(Server this, unsigned int i) /* * read failure / close connection */ - loggerLog(this->logger, LOGGER_INFO, "connection closed..."); - serverCloseConn(this, i); + loggerLog(this->logger, LOGGER_INFO, + "connection[%d] closed...%s", + fd, + inet_ntoa((((this->conns)[fd].sock)->addr).sin_addr)); break; default: diff --git a/src/server/run.c b/src/server/run.c index 69d598d..f13ab76 100644 --- a/src/server/run.c +++ b/src/server/run.c @@ -75,13 +75,15 @@ serverRun(Server this) */ int size; - if (0 < (size=serverRead(this, i))) { + if (0 >= (size=serverRead(this, i))) { + serverCloseConn(this, i); + } + else { int j; HttpRequestQueue queue = ((HttpRequestParser)(this->conns)[fd].reader)->request_queue; for (j=0; jnrequests; j++) { - HttpRequest request = queue->requests[j]; HttpResponse response; /** @@ -90,20 +92,22 @@ serverRun(Server this) */ response = httpResponse404(); - if (httpRequestHasKeepAlive(request)) { + if (httpRequestHasKeepAlive(queue->requests[j])) { + (this->conns)[fd].keep_alive = 1; httpResponseHeaderSet( response, "Connection", "Keep-Alive"); } else { + (this->conns)[fd].keep_alive = 0; httpResponseHeaderSet( response, "Connection", "Close"); } - delete(&request); + delete(&(queue->requests[j])); (this->conns)[fd].wbuf = calloc( 1, httpResponseSizeGet(response) + 1); diff --git a/src/testserver.c b/src/testserver.c index eacdb85..f88f20e 100644 --- a/src/testserver.c +++ b/src/testserver.c @@ -16,13 +16,11 @@ int main() { - struct rlimit limit = {RLIM_INFINITY, RLIM_INFINITY}; - Logger logger = new(LoggerStderr, LOGGER_ERR); HttpRequestParser parser = new(HttpRequestParser); Server server = new(Server, logger, parser, 11212, SOMAXCONN); - //Server server = new(Server, logger, parser, 11212, 20); + struct rlimit limit = {RLIM_INFINITY, RLIM_INFINITY}; setrlimit(RLIMIT_CPU, &limit); init_signals();