Browse Source

fix seaks and hangs after adding response object (mostly not related with the response object but how i integated it into serverRun

master
Georg Hopp 14 years ago
parent
commit
983c933908
  1. 8
      ChangeLog
  2. 8
      src/server.c
  3. 5
      src/server/close_conn.c
  4. 8
      src/server/read.c
  5. 12
      src/server/run.c
  6. 4
      src/testserver.c

8
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 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 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 2012-02-10 09:59:41 +0100 Georg Hopp

8
src/server.c

@ -36,15 +36,15 @@ dtor(void * _this)
Server this = _this; Server this = _this;
int i; int i;
for (i=1; i<this->nfds; i++) {
/*
* @TODO do some finalization...buffer handling...etc.
*/
for (i=0; i<this->nfds; i++) {
if (this->sock->handle != (this->fds)[i].fd) {
delete(&(this->conns[(this->fds)[i].fd]).sock); delete(&(this->conns[(this->fds)[i].fd]).sock);
delete(&(this->conns[(this->fds)[i].fd]).reader); delete(&(this->conns[(this->fds)[i].fd]).reader);
if (this->conns[(this->fds)[i].fd].wbuf) if (this->conns[(this->fds)[i].fd].wbuf)
free(this->conns[(this->fds)[i].fd].wbuf); free(this->conns[(this->fds)[i].fd].wbuf);
} }
}
delete(&this->sock); delete(&this->sock);
} }

5
src/server/close_conn.c

@ -11,7 +11,10 @@ serverCloseConn(Server this, unsigned int i)
delete(&((this->conns)[fd].sock)); delete(&((this->conns)[fd].sock));
delete(&((this->conns)[fd].reader)); 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->conns)[fd].keep_alive = 0;
(this->fds)[i].events = 0; (this->fds)[i].events = 0;

8
src/server/read.c

@ -10,7 +10,7 @@ serverRead(Server this, unsigned int i)
this->logger, this->logger,
LOGGER_INFO, LOGGER_INFO,
"initialization error: NULL reader"); "initialization error: NULL reader");
serverCloseConn(this, i);
return -1;
} }
switch ((size = streamReaderRead((this->conns)[fd].reader, fd))) { switch ((size = streamReaderRead((this->conns)[fd].reader, fd))) {
@ -25,8 +25,10 @@ serverRead(Server this, unsigned int i)
/* /*
* read failure / close connection * 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; break;
default: default:

12
src/server/run.c

@ -75,13 +75,15 @@ serverRun(Server this)
*/ */
int size; int size;
if (0 < (size=serverRead(this, i))) {
if (0 >= (size=serverRead(this, i))) {
serverCloseConn(this, i);
}
else {
int j; int j;
HttpRequestQueue queue = HttpRequestQueue queue =
((HttpRequestParser)(this->conns)[fd].reader)->request_queue; ((HttpRequestParser)(this->conns)[fd].reader)->request_queue;
for (j=0; j<queue->nrequests; j++) { for (j=0; j<queue->nrequests; j++) {
HttpRequest request = queue->requests[j];
HttpResponse response; HttpResponse response;
/** /**
@ -90,20 +92,22 @@ serverRun(Server this)
*/ */
response = httpResponse404(); response = httpResponse404();
if (httpRequestHasKeepAlive(request)) {
if (httpRequestHasKeepAlive(queue->requests[j])) {
(this->conns)[fd].keep_alive = 1;
httpResponseHeaderSet( httpResponseHeaderSet(
response, response,
"Connection", "Connection",
"Keep-Alive"); "Keep-Alive");
} }
else { else {
(this->conns)[fd].keep_alive = 0;
httpResponseHeaderSet( httpResponseHeaderSet(
response, response,
"Connection", "Connection",
"Close"); "Close");
} }
delete(&request);
delete(&(queue->requests[j]));
(this->conns)[fd].wbuf = calloc( (this->conns)[fd].wbuf = calloc(
1, httpResponseSizeGet(response) + 1); 1, httpResponseSizeGet(response) + 1);

4
src/testserver.c

@ -16,13 +16,11 @@
int int
main() main()
{ {
struct rlimit limit = {RLIM_INFINITY, RLIM_INFINITY};
Logger logger = new(LoggerStderr, LOGGER_ERR); Logger logger = new(LoggerStderr, LOGGER_ERR);
HttpRequestParser parser = new(HttpRequestParser); HttpRequestParser parser = new(HttpRequestParser);
Server server = new(Server, logger, parser, 11212, SOMAXCONN); 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); setrlimit(RLIMIT_CPU, &limit);
init_signals(); init_signals();

Loading…
Cancel
Save