38 #include "log.h" |
38 #include "log.h" |
39 #include "error.h" |
39 #include "error.h" |
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; |
45 int error; |
46 } EventHttpIO; |
46 } EventHttpIO; |
47 |
47 |
48 |
48 |
49 int connection_read(Connection *conn, void *buf, int len) { |
49 int connection_read(Connection *conn, void *buf, int len) { |
50 return (int)read(conn->fd, buf, len); |
50 return (int)read(conn->fd, buf, len); |
219 * to start the request handling, we begin with a poll on the socket, |
219 * to start the request handling, we begin with a poll on the socket, |
220 * |
220 * |
221 * evt_enq_conn() --> event handler --> handle_request() |
221 * evt_enq_conn() --> event handler --> handle_request() |
222 */ |
222 */ |
223 |
223 |
224 event_handler_t *ev = ((EventSessionHandler*)handler)->eventhandler; |
224 Event *event = malloc(sizeof(Event)); |
225 |
225 ZERO(event, sizeof(Event)); |
226 event_t *event = malloc(sizeof(event_t)); |
|
227 ZERO(event, sizeof(event_t)); |
|
228 event->fn = evt_request_input; |
226 event->fn = evt_request_input; |
229 event->finish = evt_request_finish; |
227 event->finish = evt_request_finish; |
230 event->cookie = io; |
228 event->cookie = io; |
|
229 |
|
230 EventHandler *ev = ev_instance(((EventSessionHandler*)handler)->eventhandler); |
231 |
231 |
232 if(ev_pollin(ev, conn->fd, event) != 0) { |
232 if(ev_pollin(ev, conn->fd, event) != 0) { |
233 // TODO: ev_pollin should log, intercept some errors here |
233 // TODO: ev_pollin should log, intercept some errors here |
234 log_ereport(LOG_FAILURE, "Cannot enqueue connection"); |
234 log_ereport(LOG_FAILURE, "Cannot enqueue connection"); |
235 connection_destroy(conn); |
235 connection_destroy(conn); |
236 // TODO: free stuff |
236 // TODO: free stuff |
237 } |
237 } |
238 } |
238 } |
239 |
239 |
240 int evt_request_input(event_handler_t *handler, event_t *event) { |
240 int evt_request_input(EventHandler *handler, Event *event) { |
241 EventHttpIO *io = event->cookie; |
241 EventHttpIO *io = event->cookie; |
242 HttpParser *parser = io->parser; |
242 HttpParser *parser = io->parser; |
243 HTTPRequest *request = io->request; |
243 HTTPRequest *request = io->request; |
244 Connection *conn = io->request->connection; |
244 Connection *conn = io->request->connection; |
245 netbuf *buf = request->netbuf; |
245 netbuf *buf = request->netbuf; |
253 if(r <= 0) { |
253 if(r <= 0) { |
254 if(conn->ssl) { |
254 if(conn->ssl) { |
255 // SSL specific error handling |
255 // SSL specific error handling |
256 switch(conn->ssl_error) { |
256 switch(conn->ssl_error) { |
257 case SSL_ERROR_WANT_READ: { |
257 case SSL_ERROR_WANT_READ: { |
258 event->poll = EVENT_POLLIN; |
258 event->events = EVENT_POLLIN; |
259 return 1; |
259 return 1; |
260 } |
260 } |
261 case SSL_ERROR_WANT_WRITE: { |
261 case SSL_ERROR_WANT_WRITE: { |
262 event->poll = EVENT_POLLOUT; |
262 event->events = EVENT_POLLOUT; |
263 return 1; |
263 return 1; |
264 } |
264 } |
265 } |
265 } |
266 } |
266 } |
267 |
267 |
310 * polling and executes event->finish (evt_request_input_finish) |
310 * polling and executes event->finish (evt_request_input_finish) |
311 */ |
311 */ |
312 return 0; |
312 return 0; |
313 } |
313 } |
314 |
314 |
315 int evt_request_finish(event_handler_t *h, event_t *event) { |
315 int evt_request_finish(EventHandler *h, Event *event) { |
316 EventHttpIO *io = event->cookie; |
316 EventHttpIO *io = event->cookie; |
317 HttpParser *parser = io->parser; |
317 HttpParser *parser = io->parser; |
318 HTTPRequest *request = io->request; |
318 HTTPRequest *request = io->request; |
319 |
319 |
320 int r = handle_request(request, NULL); |
320 int r = handle_request(request, NULL, h); |
321 if(r != 0) { |
321 if(r != 0) { |
322 // TODO: error message |
322 // TODO: error message |
323 close(request->connection->fd); |
323 close(request->connection->fd); |
324 } |
324 } |
325 |
325 |