Browse Source

now each HttpRequestParser initializes its own request queue and enqueus completed requests there. The server now gets the queue and prints completed requests.

master
Georg Hopp 14 years ago
parent
commit
90df11c014
  1. 26
      ChangeLog
  2. 5
      include/http/request_parser.h
  3. 4
      include/http/request_queue.h
  4. 2
      src/Makefile.am
  5. 3
      src/http/request.c
  6. 28
      src/http/request_parser.c
  7. 8
      src/server/handle_accept.c
  8. 60
      src/server/run.c

26
ChangeLog

@ -1,6 +1,30 @@
2012-02-07 13:41:49 +0100 Georg Hopp
* now each HttpRequestParser initializes its own request queue and enqueus completed requests there. The server now gets the queue and prints completed requests. (HEAD, master)
2012-02-07 11:12:30 +0100 Georg Hopp
* started filling out a request object with the parser
2012-02-07 09:29:59 +0100 Georg Hopp
* porformance improvement in parsing process (no longer do alloc and free on each line)
2012-02-07 08:52:18 +0100 Georg Hopp
* basic request parsing (line by line) implemented
2012-02-06 16:08:13 +0100 Georg Hopp
* split server implementation for readability
2012-02-06 11:35:40 +0100 Georg Hopp
* free reader (HttpRequestParser) when connection is closed
2012-02-06 11:20:00 +0100 Georg Hopp 2012-02-06 11:20:00 +0100 Georg Hopp
* add StreamReader interface, modify HttpRequestParser and Server to use it (HEAD, master)
* add StreamReader interface, modify HttpRequestParser and Server to use it
2012-02-06 11:15:00 +0100 Georg Hopp 2012-02-06 11:15:00 +0100 Georg Hopp

5
include/http/request_parser.h

@ -2,8 +2,7 @@
#define __HTTP_REQUEST_PARSER_H__ #define __HTTP_REQUEST_PARSER_H__
#include "class.h" #include "class.h"
//#include "http/request.h"
//#include "http/request_queue.h"
#include "http/request_queue.h"
#define HTTP_REQUEST_PARSER_READ_CHUNK 1024 #define HTTP_REQUEST_PARSER_READ_CHUNK 1024
@ -21,7 +20,7 @@ CLASS(HttpRequestParser) {
size_t buffer_used; size_t buffer_used;
size_t buffer_size; size_t buffer_size;
//HttpRequestQueue request_queue;
HttpRequestQueue request_queue;
HttpRequestState state; HttpRequestState state;
}; };

4
include/http/request_queue.h

@ -9,8 +9,8 @@
CLASS(HttpRequestQueue) { CLASS(HttpRequestQueue) {
HttpRequest requests[HTTP_REQUEST_QUEUE_MAX]; HttpRequest requests[HTTP_REQUEST_QUEUE_MAX];
size_t nrequests;
}
size_t nrequests;
};
#endif /* __HTTP_REQUEST_QUEUE_H__ */ #endif /* __HTTP_REQUEST_QUEUE_H__ */

2
src/Makefile.am

@ -5,7 +5,7 @@ CLASS = class.c interface.c interface/class.c
SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c
SERVER = server.c server/run.c server/close_conn.c SERVER = server.c server/run.c server/close_conn.c
LOGGER = logger.c logger/stderr.c logger/syslog.c interface/logger.c LOGGER = logger.c logger/stderr.c logger/syslog.c interface/logger.c
HTTP = interface/stream_reader.c http/request_parser.c http/request.c
HTTP = interface/stream_reader.c http/request_parser.c http/request.c http/request_queue.c
AM_CFLAGS = -Wall -I ../include/ AM_CFLAGS = -Wall -I ../include/

3
src/http/request.c

@ -2,9 +2,10 @@
#include <stdarg.h> #include <stdarg.h>
#include "class.h" #include "class.h"
#include "http/request.h"
#include "interface/class.h" #include "interface/class.h"
#include "http/request.h"
static static
void void
_free(void ** data) _free(void ** data)

28
src/http/request_parser.c

@ -11,7 +11,7 @@
#include "interface/class.h" #include "interface/class.h"
#include "interface/stream_reader.h" #include "interface/stream_reader.h"
#include "http/request.h" #include "http/request.h"
//#include "http/request_queue.h"
#include "http/request_queue.h"
static static
void void
@ -23,7 +23,7 @@ ctor(void * _this, va_list * params)
{ {
HttpRequestParser this = _this; HttpRequestParser this = _this;
//this->request_queue = va_arg(*params, HttpRequestQueue);
this->request_queue = new(HttpRequestQueue);
this->buffer = malloc(HTTP_REQUEST_PARSER_READ_CHUNK); this->buffer = malloc(HTTP_REQUEST_PARSER_READ_CHUNK);
this->buffer[0] = 0; this->buffer[0] = 0;
@ -36,6 +36,7 @@ dtor(void * _this)
HttpRequestParser this = _this; HttpRequestParser this = _this;
free(this->buffer); free(this->buffer);
delete(&(this->request_queue));
} }
static static
@ -46,7 +47,10 @@ _clone(void * _this, void * _base)
HttpRequestParser base = _base; HttpRequestParser base = _base;
size_t chunks; size_t chunks;
//this->request_queue = base->request_queue;
/**
* every parser has its own queue...
*/
this->request_queue = new(HttpRequestQueue);
this->buffer_used = base->buffer_used; this->buffer_used = base->buffer_used;
chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK; chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK;
@ -183,10 +187,6 @@ httpRequestParserParse(HttpRequestParser this)
} }
} }
printf("method: %s\n", request->method);
printf("uri: %s\n", request->uri);
printf("version: %s\n", request->http_version);
header_idx = 0; header_idx = 0;
this->state = HTTP_REQUEST_REQEUST_LINE_DONE; this->state = HTTP_REQUEST_REQEUST_LINE_DONE;
break; break;
@ -223,16 +223,6 @@ httpRequestParserParse(HttpRequestParser this)
case HTTP_REQUEST_HEADERS_DONE: case HTTP_REQUEST_HEADERS_DONE:
puts("==headers done=="); puts("==headers done==");
{
int i;
for (i=0; i<header_idx; i++) {
printf("header-name: %s\n", (request->header)[i].name);
printf("header-value: %s\n", (request->header)[i].value);
}
}
printf("%s\n", line);
this->state = HTTP_REQUEST_DONE; this->state = HTTP_REQUEST_DONE;
break; break;
@ -249,7 +239,9 @@ httpRequestParserParse(HttpRequestParser this)
cont = 0; cont = 0;
} }
delete(&request);
this->request_queue->requests[(this->request_queue->nrequests)++] =
request;
this->state = HTTP_REQUEST_GARBAGE; this->state = HTTP_REQUEST_GARBAGE;
break; break;

8
src/server/handle_accept.c

@ -9,8 +9,12 @@ serverHandleAccept(Server this)
acc = socketAccept(this->sock, remoteAddr); acc = socketAccept(this->sock, remoteAddr);
if (-1 != acc->handle) { if (-1 != acc->handle) {
(this->conns)[this->nfds].sock = acc; // save the socket handle
(this->conns)[this->nfds].reader = clone(this->reader); // clone reader
//* save the socket handle
(this->conns)[this->nfds].sock = acc;
//* clone reader
(this->conns)[this->nfds].reader = clone(this->reader);
(this->fds)[this->nfds].fd = acc->handle; (this->fds)[this->nfds].fd = acc->handle;
(this->fds)[this->nfds].events = POLLIN; (this->fds)[this->nfds].events = POLLIN;
this->nfds++; this->nfds++;

60
src/server/run.c

@ -10,6 +10,13 @@
#include "signalHandling.h" #include "signalHandling.h"
#include "interface/class.h" #include "interface/class.h"
#include "interface/stream_reader.h" #include "interface/stream_reader.h"
#include "interface/logger.h"
//* @TODO: to be removed
#include "http/request.h"
#include "http/request_parser.h"
#include "http/request_queue.h"
//* until here
#undef MAX #undef MAX
#define MAX(x,y) ((x) > (y) ? (x) : (y)) #define MAX(x,y) ((x) > (y) ? (x) : (y))
@ -21,11 +28,18 @@
void void
serverRun(Server this) serverRun(Server this)
{ {
/*
* @TODO again...add verbosity to logger....
*/
loggerLog(this->logger, LOGGER_INFO, "service started"); loggerLog(this->logger, LOGGER_INFO, "service started");
/**
* @TODO: actually this is the main loop of my server. When
* stuff becomes more complicated it might be feasabible to
* split stuff into separate processes. This will definetly
* involve some IPC and syncing. Right now as this is actually
* only a simple HTTP server implementation we go on with
* this single process.
* What we can first do to get some processing between read/write
* cicles is to use the poll timeout.
*/
while (!doShutdown) /* until error or signal */ while (!doShutdown) /* until error or signal */
{ {
int events; int events;
@ -46,6 +60,46 @@ serverRun(Server this)
* handle reads * handle reads
*/ */
serverRead(this); serverRead(this);
/**
* do some other processing
* @TODO: actually this will hard assume that our stream reader
* is a http parser and it has its queue...think about more
* generalizing here.
*/
{
int i;
for (i=1; i<this->nfds; i++) {
int j;
HttpRequestQueue queue =
((HttpRequestParser)(this->conns)[i].reader)->request_queue;
for (j=0; j<queue->nrequests; j++) {
int k;
HttpRequest request = queue->requests[j];
printf("method: %s\n", request->method);
printf("uri: %s\n", request->uri);
printf("version: %s\n", request->http_version);
puts("");
for (k=0; k<128; k++) {
if (NULL == (request->header)[k].name) break;
printf("header-name: %s\n", (request->header)[k].name);
printf("header-value: %s\n", (request->header)[k].value);
}
delete(&request);
}
queue->nrequests = 0;
}
}
/**
* handle writes
*/
} }
} }

Loading…
Cancel
Save