181 request->connection = conn; |
181 request->connection = conn; |
182 conn->session_handler = handler; |
182 conn->session_handler = handler; |
183 |
183 |
184 // set socket non blocking |
184 // set socket non blocking |
185 int flags; |
185 int flags; |
186 if (-1 == (flags = fcntl(conn->fd, F_GETFL, 0))) { |
186 if ((flags = fcntl(conn->fd, F_GETFL, 0)) == -1) { |
187 flags = 0; |
187 flags = 0; |
188 } |
188 } |
189 if (fcntl(conn->fd, F_SETFL, flags | O_NONBLOCK) != 0) { |
189 if (fcntl(conn->fd, F_SETFL, flags | O_NONBLOCK) != 0) { |
190 perror("Error: start_event_session: fcntl"); |
190 perror("Error: start_event_session: fcntl"); |
191 // TODO: error |
191 // TODO: error |
221 * evt_enq_conn() --> event handler --> handle_request() |
221 * evt_enq_conn() --> event handler --> handle_request() |
222 */ |
222 */ |
223 |
223 |
224 Event *event = malloc(sizeof(Event)); |
224 Event *event = malloc(sizeof(Event)); |
225 ZERO(event, sizeof(Event)); |
225 ZERO(event, sizeof(Event)); |
226 event->fn = evt_request_input; |
226 event->fn = conn->ssl ? evt_request_ssl_accept : evt_request_input; |
227 event->finish = evt_request_finish; |
227 event->finish = evt_request_finish; |
228 event->cookie = io; |
228 event->cookie = io; |
229 |
229 |
230 EventHandler *ev = ev_instance(((EventSessionHandler*)handler)->eventhandler); |
230 EventHandler *ev = ev_instance(((EventSessionHandler*)handler)->eventhandler); |
231 |
231 |
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 } |
|
239 |
|
240 int evt_request_ssl_accept(EventHandler *handler, Event *event) { |
|
241 EventHttpIO *io = event->cookie; |
|
242 Connection *conn = io->request->connection; |
|
243 |
|
244 int ret = SSL_accept(conn->ssl); |
|
245 if(ret <= 0) { |
|
246 int error = SSL_get_error(conn->ssl, ret); |
|
247 char *errstr; |
|
248 switch(error) { |
|
249 default: errstr = "unknown"; break; |
|
250 case SSL_ERROR_WANT_READ: { |
|
251 event->events = EVENT_POLLIN; |
|
252 return 1; |
|
253 } |
|
254 case SSL_ERROR_WANT_WRITE: { |
|
255 event->events = EVENT_POLLOUT; |
|
256 return 1; |
|
257 } |
|
258 case SSL_ERROR_ZERO_RETURN: errstr = "SSL_ERROR_ZERO_RETURN"; break; |
|
259 case SSL_ERROR_WANT_CONNECT: errstr = "SSL_ERROR_WANT_CONNECT"; break; |
|
260 case SSL_ERROR_WANT_ACCEPT: errstr = "SSL_ERROR_WANT_ACCEPT"; break; |
|
261 case SSL_ERROR_WANT_X509_LOOKUP: errstr = "SSL_ERROR_WANT_X509_LOOKUP"; break; |
|
262 case SSL_ERROR_SYSCALL: errstr = "SSL_ERROR_SYSCALL"; break; |
|
263 case SSL_ERROR_SSL: errstr = "SL_ERROR_SSL"; break; |
|
264 |
|
265 log_ereport(LOG_VERBOSE, "SSL accept error[%d]: %s", error, errstr); |
|
266 event->finish = evt_request_error; |
|
267 io->error = 1; |
|
268 return 0; |
|
269 } |
|
270 } |
|
271 |
|
272 // SSL_accept successful, start request input now |
|
273 event->fn = evt_request_input; |
|
274 return evt_request_input(handler, event); |
238 } |
275 } |
239 |
276 |
240 int evt_request_input(EventHandler *handler, Event *event) { |
277 int evt_request_input(EventHandler *handler, Event *event) { |
241 EventHttpIO *io = event->cookie; |
278 EventHttpIO *io = event->cookie; |
242 HttpParser *parser = io->parser; |
279 HttpParser *parser = io->parser; |