src/server/daemon/sessionhandler.c

branch
aio
changeset 188
0e6a05c779e0
parent 159
9ba9f8befa80
child 191
391ccd490d97
equal deleted inserted replaced
187:4384bfbb7e26 188:0e6a05c779e0
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;

mercurial