0
@@ -282,6 +282,58 @@ error:
0
ebb_client_close(client);
0
+static void on_client_writable(struct ev_loop *loop, ev_io *watcher, int revents)
0
+ ebb_client *client = (ebb_client*)(watcher->data);
0
+ if(client->status_written == FALSE || client->headers_written == FALSE) {
0
+ g_message("no status or headers - closing connection.");
0
+ if(EV_ERROR & revents) {
0
+ g_message("on_client_writable() got error event, closing peer");
0
+ //if(client->written != 0)
0
+ // g_debug("total written: %d", (int)(client->written));
0
+ sent = send( client->fd
0
+ , client->response_buffer->str + sizeof(gchar)*(client->written)
0
+ , client->response_buffer->len - client->written
0
+ g_message("Error writing: %s", strerror(errno));
0
+ } else if(sent == 0) {
0
+ /* is this the wrong thing to do? */
0
+ g_message("Sent zero bytes? Closing connection");
0
+ client->written += sent;
0
+ assert(client->written <= client->response_buffer->len);
0
+ //g_message("wrote %d bytes. total: %d", (int)sent, (int)(client->written));
0
+ ev_timer_again(loop, &(client->timeout_watcher));
0
+ if(client->written == client->response_buffer->len) {
0
+ ev_io_stop(loop, watcher);
0
+ if(client->body_written)
0
+ ebb_client_close(client);
0
+ ebb_client_close(client);
0
static client_init(ebb_server *server, ebb_client *client)
0
assert(client->in_use == FALSE);
0
@@ -330,9 +382,15 @@ static client_init(ebb_server *server, ebb_client *client)
0
client->status_written = FALSE;
0
client->headers_written = FALSE;
0
client->body_written = FALSE;
0
- client->
began_transmission = FALSE;
0
/* SETUP READ AND TIMEOUT WATCHERS */
0
+ client->write_watcher.data = client;
0
+ ev_init (&client->write_watcher, on_client_writable);
0
+ ev_io_set (&client->write_watcher, client->fd, EV_WRITE | EV_ERROR);
0
+ /* Note, do not start write_watcher until there is something to be written.
0
+ * See ebb_client_write_body() */
0
client->read_watcher.data = client;
0
ev_init(&client->read_watcher, on_client_readable);
0
ev_io_set(&client->read_watcher, client->fd, EV_READ | EV_ERROR);
0
@@ -520,6 +578,7 @@ void ebb_client_release(ebb_client *client)
0
assert(client->in_use);
0
client->in_use = FALSE;
0
+ client->body_written = TRUE;
0
if(client->written == client->response_buffer->len)
0
ebb_client_close(client);
0
@@ -550,53 +609,6 @@ void ebb_client_close(ebb_client *client)
0
-static void on_client_writable(struct ev_loop *loop, ev_io *watcher, int revents)
0
- ebb_client *client = (ebb_client*)(watcher->data);
0
- assert(client->status_written);
0
- assert(client->headers_written);
0
- assert(client->began_transmission);
0
- if(EV_ERROR & revents) {
0
- g_message("on_client_writable() got error event, closing peer");
0
- ebb_client_close(client);
0
- //if(client->written != 0)
0
- // g_debug("total written: %d", (int)(client->written));
0
- sent = send( client->fd
0
- , client->response_buffer->str + sizeof(gchar)*(client->written)
0
- , client->response_buffer->len - client->written
0
- g_message("Error writing: %s", strerror(errno));
0
- ebb_client_close(client);
0
- } else if(sent == 0) {
0
- g_message("Sent zero bytes? Closing connection");
0
- ebb_client_close(client);
0
- client->written += sent;
0
- assert(client->written <= client->response_buffer->len);
0
- //g_message("wrote %d bytes. total: %d", (int)sent, (int)(client->written));
0
- ev_timer_again(loop, &(client->timeout_watcher));
0
- if(client->written == client->response_buffer->len) {
0
- ev_io_stop(loop, watcher);
0
- if(client->body_written)
0
- ebb_client_close(client);
0
void ebb_client_write_status(ebb_client *client, int status, const char *human_status)
0
assert(client->in_use);
0
@@ -623,39 +635,29 @@ void ebb_client_write_header(ebb_client *client, const char *field, const char *
0
-void ebb_client_write(ebb_client *client, const char *data, int length)
0
- assert(client->in_use);
0
- if(!client->open) return;
0
- g_string_append_len(client->response_buffer, data, length);
0
- if(client->began_transmission) {
0
- /* restart the watcher if we're streaming */
0
- ev_io_start(client->server->loop, &client->write_watcher);
0
-void ebb_client_
begin_transmission(ebb_client *client)
0
+void ebb_client_
write_body(ebb_client *client, const char *data, int length)
0
assert(client->in_use);
0
if(!client->open) return;
0
- assert(FALSE == ev_is_active(&client->write_watcher));
0
- /* assure the socket is still in non-blocking mode */
0
- int flags = fcntl(client->fd, F_GETFL, 0);
0
- if(0 > fcntl(client->fd, F_SETFL, flags | O_NONBLOCK)) {
0
- ebb_client_close(client);
0
+ if(client->headers_written == FALSE) {
0
+ g_string_append(client->response_buffer, "\r\n");
0
- client->headers_written = TRUE;
0
- client->began_transmission = TRUE;
0
- client->write_watcher.data = client;
0
- ev_init (&(client->write_watcher), on_client_writable);
0
- ev_io_set (&(client->write_watcher), client->fd, EV_WRITE | EV_ERROR);
0
- ev_io_start(client->server->loop, &client->write_watcher);
0
+ g_string_append_len(client->response_buffer, data, length);
0
+ /* If the write_watcher isn't yet active, then start it. It could be that
0
+ * we're streaming and the watcher has been stopped. In that case we
0
+ * start it again since we have more to write. */
0
+ if(ev_is_active(&client->write_watcher) == FALSE) {
0
+ /* assure the socket is still in non-blocking mode */
0
+ int flags = fcntl(client->fd, F_GETFL, 0);
0
+ if(0 > fcntl(client->fd, F_SETFL, flags | O_NONBLOCK))
0
+ perror("fcntl() setting non-block");
0
+ client->headers_written = TRUE;
0
+ ev_io_start(client->server->loop, &client->write_watcher);
Comments
No one has commented yet.