40 #include "httplistener.h" |
40 #include "httplistener.h" |
41 |
41 |
42 typedef struct _event_http_io { |
42 typedef struct _event_http_io { |
43 HTTPRequest *request; |
43 HTTPRequest *request; |
44 HttpParser *parser; |
44 HttpParser *parser; |
45 int error; |
|
46 } EventHttpIO; |
45 } EventHttpIO; |
47 |
46 |
48 |
47 |
49 int connection_read(Connection *conn, void *buf, int len) { |
48 int connection_read(Connection *conn, void *buf, int len) { |
50 return (int)read(conn->fd, buf, len); |
49 return (int)read(conn->fd, buf, len); |
211 if(io == NULL) { |
210 if(io == NULL) { |
212 // TODO: error handling |
211 // TODO: error handling |
213 } |
212 } |
214 io->request = request; |
213 io->request = request; |
215 io->parser = parser; |
214 io->parser = parser; |
216 io->error = 0; |
|
217 |
215 |
218 /* |
216 /* |
219 * to start the request handling, we begin with a poll on the socket, |
217 * to start the request handling, we begin with a poll on the socket, |
220 * |
218 * |
221 * evt_enq_conn() --> event handler --> handle_request() |
219 * evt_enq_conn() --> event handler --> handle_request() |
222 */ |
220 */ |
223 |
221 |
224 event_handler_t *ev = ((EventSessionHandler*)handler)->eventhandler; |
222 event_handler_t *ev = ((EventSessionHandler*)handler)->eventhandler; |
225 |
223 |
226 event_t *event = malloc(sizeof(event_t)); |
224 event_t *event = malloc(sizeof(event_t)); |
227 ZERO(event, sizeof(event_t)); |
|
228 event->fn = evt_request_input; |
225 event->fn = evt_request_input; |
229 event->finish = evt_request_finish; |
226 event->finish = evt_request_finish; |
230 event->cookie = io; |
227 event->cookie = io; |
231 |
228 |
232 if(ev_pollin(ev, conn->fd, event) != 0) { |
229 if(ev_pollin(ev, conn->fd, event) != 0) { |
276 state = http_parser_process(parser); |
272 state = http_parser_process(parser); |
277 if(state == 2) { |
273 if(state == 2) { |
278 // parse error |
274 // parse error |
279 fatal_error(request, 400); |
275 fatal_error(request, 400); |
280 event->finish = evt_request_error; |
276 event->finish = evt_request_error; |
281 io->error = 2; |
|
282 return 0; |
277 return 0; |
283 } else if(state == 1) { |
278 } else if(state == 1) { |
284 /* |
279 /* |
285 * we need more data -> return 1 to tell the event handler to |
280 * we need more data -> return 1 to tell the event handler to |
286 * continue polling |
281 * continue polling |
336 free(event); |
330 free(event); |
337 |
331 |
338 return 0; |
332 return 0; |
339 } |
333 } |
340 |
334 |
341 int evt_request_error(event_handler_t *h, event_t *event) { |
335 int evt_request_error(event_handler_t *h, event_t *event) { |
342 EventHttpIO *io = event->cookie; |
336 EventHttpIO *io = event->cookie; |
343 HttpParser *parser = io->parser; |
337 HttpParser *parser = io->parser; |
344 HTTPRequest *request = io->request; |
338 HTTPRequest *request = io->request; |
345 |
|
346 if(event->error) { |
|
347 log_ereport(LOG_VERBOSE, "sessionhandler http io error: %d", io->error); |
|
348 } |
|
349 |
339 |
350 free(request->netbuf->inbuf); |
340 free(request->netbuf->inbuf); |
351 free(request->netbuf); |
341 free(request->netbuf); |
352 |
342 |
353 cfg_unref(request->connection->listener->cfg); |
343 cfg_unref(request->connection->listener->cfg); |