From 3d735c7fc7ce1a952b70c7c734875bd92015085d Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Fri, 10 Feb 2012 09:52:27 +0100 Subject: [PATCH] made a first cruel handling for keep-alive and non keep-alive requests. @TODO: this MUST BE cleaned --- ChangeLog | 12 +++++-- include/server.h | 1 + src/http/request/parser/get_request_line.c | 1 + src/server/run.c | 37 +++++++++++++++++++--- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 878828d..0dd81c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,14 @@ +2012-02-10 09:52:27 +0100 Georg Hopp + + * made a first cruel handling for keep-alive and non keep-alive requests. @TODO: this MUST BE cleaned (HEAD, master) + +2012-02-10 08:14:31 +0100 Georg Hopp + + * now only use keep-alive.... (origin/master, origin/HEAD) + 2012-02-10 06:36:43 +0100 Georg Hopp - * moved request_parser.h and request_queue.h in separeate request subfolder (HEAD, master) + * moved request_parser.h and request_queue.h in separeate request subfolder 2012-02-10 06:22:39 +0100 Georg Hopp @@ -20,7 +28,7 @@ 2012-02-09 22:34:32 +0100 Georg Hopp - * start split of request parser (origin/master, origin/HEAD) + * start split of request parser 2012-02-09 11:44:17 +0100 Georg Hopp diff --git a/include/server.h b/include/server.h index 0fbcc9f..1e46903 100644 --- a/include/server.h +++ b/include/server.h @@ -42,6 +42,7 @@ CLASS(Server) { Sock sock; void * reader; + char keep_alive; char wbuf[2048]; char * rbuf; unsigned int rpos; diff --git a/src/http/request/parser/get_request_line.c b/src/http/request/parser/get_request_line.c index 8f87525..83bf131 100644 --- a/src/http/request/parser/get_request_line.c +++ b/src/http/request/parser/get_request_line.c @@ -1,3 +1,4 @@ +#include #include #include "http/request.h" diff --git a/src/server/run.c b/src/server/run.c index 85b8e37..5145b08 100644 --- a/src/server/run.c +++ b/src/server/run.c @@ -3,6 +3,7 @@ #include /* for exit */ #include /* for errno */ #include +#include #include #include "server.h" @@ -17,6 +18,7 @@ #include "http/request.h" #include "http/request/parser.h" #include "http/request/queue.h" +#include "http/header.h" //* until here #undef MAX @@ -79,16 +81,35 @@ serverRun(Server this) for (j=0; jnrequests; j++) { HttpRequest request = queue->requests[j]; + char * header; + char * header_ptr; //if (NULL != request->body) { // puts("==REQUEST BODY=="); // puts(request->body); //} + header = httpHeaderGet( + request->header, + request->nheader, + "connection"); + + if (NULL != header) { + for (header_ptr = header; + 0 != *header_ptr; + header_ptr++) { + *header_ptr = tolower(*header_ptr); + } + + if (0 == strcmp(header, "keep-alive")) { + (this->conns)[fd].keep_alive = 1; + } + } /** * @TODO: for now simply remove request and send not found. * Make this sane. */ + delete(&request); /** @@ -99,7 +120,6 @@ serverRun(Server this) char timestr[200]; #define RESP_HEAD "HTTP/1.1 404 Not Found\r\n" \ - "Connection: Keep-Alive\r\n" \ "Content-Type: text/html\r\n" \ "Content-Length: %lu\r\n" \ "Date: %s\r\n" \ @@ -121,7 +141,12 @@ serverRun(Server this) * @TODO: just to send an answer and be able to make some * apache benchs i do it here...this definetly MUST BE moved */ - sprintf((this->conns)[fd].wbuf, RESP_HEAD "\r\n" RESP_DATA, sizeof(RESP_DATA) - 1, timestr); + if ((this->conns)[fd].keep_alive) { + sprintf((this->conns)[fd].wbuf, RESP_HEAD "Connection: Keep-Alive\r\n\r\n" RESP_DATA, sizeof(RESP_DATA) - 1, timestr); + } + else { + sprintf((this->conns)[fd].wbuf, RESP_HEAD "Connection: close\r\n\r\n" RESP_DATA, sizeof(RESP_DATA) - 1, timestr); + } (this->fds)[i].events |= POLLOUT; } @@ -148,8 +173,12 @@ serverRun(Server this) "write error, closing connection"); } - //serverCloseConn(this, i); - (this->fds)[i].events &= ~POLLOUT; + if ((this->conns)[fd].keep_alive) { + (this->fds)[i].events &= ~POLLOUT; + } + else { + serverCloseConn(this, i); + } } else { memmove((this->conns)[fd].wbuf,