src/server/daemon/sessionhandler.c

changeset 46
636e05eb48f6
parent 44
3da1f7b6847f
child 47
ce9790523346
--- 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;
 }

mercurial