static void do_send(h2o_mruby_generator_t *generator, h2o_buffer_t **input, int is_final) { h2o_mruby_chunked_t *chunked = generator->chunked; assert(!chunked->sending.inflight); h2o_iovec_t buf = h2o_doublebuffer_prepare(&chunked->sending, input, generator->req->preferred_chunk_size); size_t bufcnt = 1; h2o_send_state_t send_state; if (is_final && buf.len == chunked->sending.buf->size && (*input)->size == 0) { if (buf.len == 0) --bufcnt; /* send error if the length of content served is smaller than content-length header value */ if (chunked->bytes_left == 0 || chunked->bytes_left == SIZE_MAX) { send_state = H2O_SEND_STATE_FINAL; } else { send_state = H2O_SEND_STATE_ERROR; } } else { if (buf.len == 0) return; send_state = H2O_SEND_STATE_IN_PROGRESS; } h2o_send(generator->req, &buf, bufcnt, send_state); }
static void do_send(struct rp_generator_t *self) { h2o_iovec_t vecs[1]; size_t veccnt; h2o_send_state_t ststate; assert(self->sending.bytes_inflight == 0); vecs[0] = h2o_doublebuffer_prepare(&self->sending, self->client != NULL ? &self->client->sock->input : &self->last_content_before_send, self->src_req->preferred_chunk_size); if (self->client == NULL && vecs[0].len == self->sending.buf->size && self->last_content_before_send->size == 0) { veccnt = vecs[0].len != 0 ? 1 : 0; ststate = H2O_SEND_STATE_FINAL; } else { if (vecs[0].len == 0) return; veccnt = 1; ststate = H2O_SEND_STATE_IN_PROGRESS; } if (self->had_body_error) ststate = H2O_SEND_STATE_ERROR; h2o_send(self->src_req, vecs, veccnt, ststate); }
static void do_send(struct rp_generator_t *self) { h2o_iovec_t vecs[1]; size_t veccnt; int is_eos; assert(self->sending.bytes_inflight == 0); vecs[0] = h2o_doublebuffer_prepare(&self->sending, self->client != NULL ? &self->client->sock->input : &self->last_content_before_send, self->src_req->preferred_chunk_size); if (self->client == NULL && vecs[0].len == self->sending.buf->size && self->last_content_before_send->size == 0) { veccnt = vecs[0].len != 0 ? 1 : 0; is_eos = 1; } else { if (vecs[0].len == 0) return; veccnt = 1; is_eos = 0; } h2o_send(self->src_req, vecs, veccnt, is_eos); }
static void do_send(h2o_mruby_generator_t *generator, h2o_buffer_t **input, int is_final) { h2o_mruby_chunked_t *chunked = generator->chunked; assert(chunked->sending.bytes_inflight == 0); h2o_iovec_t buf = h2o_doublebuffer_prepare(&chunked->sending, input, generator->req->preferred_chunk_size); size_t bufcnt = 1; if (is_final && buf.len == chunked->sending.buf->size && (*input)->size == 0) { if (buf.len == 0) --bufcnt; /* terminate the H1 connection if the length of content served did not match the value sent in content-length header */ if (chunked->bytes_left != SIZE_MAX && chunked->bytes_left != 0) generator->req->http1_is_persistent = 0; } else { if (buf.len == 0) return; is_final = 0; } h2o_send(generator->req, &buf, bufcnt, is_final ? H2O_SEND_STATE_FINAL : H2O_SEND_STATE_IN_PROGRESS); }