src/server/daemon/sessionhandler.c

changeset 47
ce9790523346
parent 46
636e05eb48f6
child 48
37a512d7b8f6
--- a/src/server/daemon/sessionhandler.c	Sat Jan 12 14:00:47 2013 +0100
+++ b/src/server/daemon/sessionhandler.c	Sun Jan 13 14:16:45 2013 +0100
@@ -28,12 +28,15 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <errno.h>
 
 #include "../public/nsapi.h"
 
 #include "sessionhandler.h"
 #include "httprequest.h"
 #include "httpparser.h"
+#include "log.h"
+#include "error.h"
 
 typedef struct _event_http_io {
     HTTPRequest *request;
@@ -169,7 +172,10 @@
     event->cookie = io;
     
     if(ev_pollin(ev, conn->fd, event) != 0) {
-        perror("poll");
+        // TODO: ev_pollin should log, intercept some errors here
+        log_ereport(LOG_LEVEL_ERROR, "ev_pollin failed: %s", strerror(errno));
+        close(conn->fd);
+        // TODO: free stuff
     }
 }
 
@@ -186,16 +192,16 @@
             buf->inbuf + buf->pos,
             buf->maxsize - buf->pos);
     if(r == -1) {
-        // TODO: error handling
-        fprintf(stderr, "%s\n", "Error: Cannot read from socket");
+        event->finish = evt_request_error;
         return 0;
     }
     
     buf->cursize += r;
     state = http_parser_process(parser);
     if(state == 2) {
-        // TODO: error handling
-        fprintf(stderr, "%s\n", "Error: Cannot parse http request");
+        // parse error
+        fatal_error(request, 400);
+        event->finish = evt_request_error;
         return 0;
     } else if(state == 1) {
         /*
@@ -213,8 +219,9 @@
         flags = 0;
     }
     if (fcntl(request->connection->fd, F_SETFL, flags & ~O_NONBLOCK) != 0) {
-        perror("Error: evt_request_input: fcntl");
-        // TODO: critical error
+        // just close the connection if fcntl fails
+        event->finish = evt_request_error;
+        return 0;
     }
      
     /*
@@ -232,7 +239,10 @@
     HTTPRequest *request = io->request;
     
     int r = handle_request(request, NULL);
-    // TODO: if r != REQ_PROCEED ...
+    if(r != 0) {
+        // TODO: error message
+        close(request->connection->fd);
+    }
     
     /*
      * handle_request can return before the request is finished, but it copies
@@ -250,3 +260,21 @@
     
     return 0;
 }
+
+int evt_request_error(event_handler_t *h, event_t *event) {
+    EventHttpIO *io = event->cookie;
+    HttpParser  *parser  = io->parser;
+    HTTPRequest *request = io->request;
+    
+    close(request->connection->fd);
+    
+    header_array_free(request->headers);
+    free(request);
+    
+    http_parser_free(parser);
+    
+    free(io);
+    free(event);
+    
+    return 0;
+}

mercurial