diff -r 636e05eb48f6 -r ce9790523346 src/server/daemon/sessionhandler.c --- 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 #include +#include #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; +}