/* Internal callback * called by connection->read_watcher */ static void on_readable(struct ev_loop *loop, ev_io *watcher, int revents) { ebb_connection *connection = watcher->data; char recv_buffer[4096]; ssize_t recved; //printf("on_readable\n"); // TODO -- why is this broken? //assert(ev_is_active(&connection->timeout_watcher)); assert(watcher == &connection->read_watcher); if(EV_ERROR & revents) { error("on_readable() got error event, closing connection."); goto error; } #ifdef HAVE_GNUTLS assert(!ev_is_active(&connection->handshake_watcher)); if(connection->server->secure) { recved = gnutls_record_recv( connection->session , recv_buffer , TCP_MAXWIN ); if(recved <= 0) { if(gnutls_error_is_fatal(recved)) goto error; if( (recved == GNUTLS_E_INTERRUPTED || recved == GNUTLS_E_AGAIN) && GNUTLS_NEED_WRITE ) ev_io_start(loop, &connection->write_watcher); return; } } else { #endif /* HAVE_GNUTLS */ recved = recv(connection->fd, recv_buffer, 4096, 0); if(recved <= 0) goto error; #ifdef HAVE_GNUTLS } #endif /* HAVE_GNUTLS */ ebb_connection_reset_timeout(connection); ebb_request_parser_execute(&connection->parser, recv_buffer, recved); /* parse error? just drop the client. screw the 400 response */ if(ebb_request_parser_has_error(&connection->parser)) goto error; return; error: ebb_connection_schedule_close(connection); }
/* Internal callback * called by connection->read_watcher */ static void on_readable(EV_P_ ev_io *watcher, int revents) { ebb_connection *connection = watcher->data; char base[TCP_MAXWIN]; char *recv_buffer = base; size_t recv_buffer_size = TCP_MAXWIN; ssize_t recved; //printf("on_readable\n"); // TODO -- why is this broken? //assert(ev_is_active(&connection->timeout_watcher)); assert(watcher == &connection->read_watcher); if(EV_ERROR & revents) { error("on_readable() got error event, closing connection."); goto error; } ebb_buf *buf = NULL; if(connection->new_buf) { buf = connection->new_buf(connection); if(buf == NULL) return; recv_buffer = buf->base; recv_buffer_size = buf->len; } recved = recv(connection->fd, recv_buffer, recv_buffer_size, 0); if(recved < 0) goto error; if(recved == 0) return; ebb_connection_reset_timeout(connection); ebb_request_parser_execute(&connection->parser, recv_buffer, recved); /* parse error? just drop the client. screw the 400 response */ if(ebb_request_parser_has_error(&connection->parser)) goto error; if(buf && buf->on_release) buf->on_release(buf); return; error: ebb_connection_schedule_close(connection); }
/* Internal callback * called by connection->read_watcher */ static void on_readable(struct ev_loop *loop, ev_io *watcher, int revents) { ebb_connection *connection = watcher->data; size_t offset = connection->buffered_data; int left = EBB_READ_BUFFER - offset; char* recv_buffer = connection->read_buffer + offset; ssize_t recved; //printf("on_readable\n"); // TODO -- why is this broken? //assert(ev_is_active(&connection->timeout_watcher)); assert(watcher == &connection->read_watcher); // No more buffer space. if(left == 0) goto error; if(EV_ERROR & revents) { error("on_readable() got error event, closing connection."); goto error; } recved = recv(connection->fd, recv_buffer, left, 0); if(recved <= 0) goto error; connection->buffered_data += recved; ebb_connection_reset_timeout(connection); ebb_request_parser_execute(&connection->parser, connection->read_buffer, recved, offset); if(ebb_request_parser_is_finished(&connection->parser)) { connection->buffered_data = 0; } /* parse error? just drop the client. screw the 400 response */ if(ebb_request_parser_has_error(&connection->parser)) goto error; return; error: ebb_connection_schedule_close(connection); }