--- a/src/server/daemon/sessionhandler.c Wed Jan 02 16:03:50 2013 +0100 +++ b/src/server/daemon/sessionhandler.c Sat Jan 12 14:00:47 2013 +0100 @@ -58,8 +58,9 @@ void* basic_run_session(void *data) { Connection *conn = (Connection*)data; - HTTPRequest *request = http_request_new(); - request->connection = conn; + HTTPRequest request; + http_request_init(&request); + request.connection = conn; // read request netbuf *buf = malloc(sizeof(netbuf)); @@ -71,9 +72,9 @@ buf->inbuf = malloc(2048); buf->errmsg = NULL; - request->netbuf = buf; + request.netbuf = buf; - HttpParser *parser = http_parser_new(request); + HttpParser *parser = http_parser_new(&request); int state; int r; r = read(conn->fd, buf->inbuf + buf->pos, buf->maxsize - buf->pos); @@ -99,8 +100,9 @@ } // process request - r = handle_request(request, NULL); // TODO: use correct thread pool - + r = handle_request(&request, NULL); // TODO: use correct thread pool + + // TODO: free, see evt_request_finish return NULL; } @@ -115,8 +117,10 @@ } void evt_enq_conn(SessionHandler *handler, Connection *conn) { - HTTPRequest *request = http_request_new(); + HTTPRequest *request = malloc(sizeof(HTTPRequest)); + http_request_init(request); request->connection = conn; + conn->session_handler = handler; // set socket non blocking int flags; @@ -161,6 +165,7 @@ event_t *event = malloc(sizeof(event_t)); event->fn = evt_request_input; + event->finish = evt_request_finish; event->cookie = io; if(ev_pollin(ev, conn->fd, event) != 0) { @@ -211,9 +216,37 @@ perror("Error: evt_request_input: fcntl"); // TODO: critical error } + + /* + * process request + * + * We return 0 to finish request input. The event handler than stops + * polling and executes event->finish (evt_request_input_finish) + */ + return 0; +} + +int evt_request_finish(event_handler_t *h, event_t *event) { + EventHttpIO *io = event->cookie; + HttpParser *parser = io->parser; + HTTPRequest *request = io->request; - // process request - r = handle_request(request, NULL); + int r = handle_request(request, NULL); + // TODO: if r != REQ_PROCEED ... - return 0; // TODO: return before handle_request + /* + * handle_request can return before the request is finished, but it copies + * all important data. We can free request, parser and event + * + * don't free request->netbuf and request->connection + */ + header_array_free(request->headers); + free(request); + + http_parser_free(parser); + + free(io); + free(event); + + return 0; }