static mrb_value send_chunked_method(mrb_state *mrb, mrb_value self) { h2o_mruby_generator_t *generator = h2o_mruby_current_generator; const char *s; mrb_int len; /* parse args */ mrb_get_args(mrb, "s", &s, &len); { /* precond check */ mrb_value exc = check_precond(mrb, generator); if (!mrb_nil_p(exc)) mrb_exc_raise(mrb, exc); } /* append to send buffer, and send out immediately if necessary */ if (len != 0) { h2o_mruby_chunked_t *chunked = generator->chunked; if (chunked->bytes_left != SIZE_MAX) { if (len > chunked->bytes_left) len = chunked->bytes_left; chunked->bytes_left -= len; } if (len != 0) { h2o_buffer_reserve(&chunked->callback.receiving, len); memcpy(chunked->callback.receiving->bytes + chunked->callback.receiving->size, s, len); chunked->callback.receiving->size += len; if (chunked->sending.bytes_inflight == 0) do_send(generator, &chunked->callback.receiving, 0); } } return mrb_nil_value(); }
mrb_value h2o_mruby_send_chunked_eos_callback(h2o_mruby_generator_t *generator, mrb_value receiver, mrb_value input, int *next_action) { mrb_state *mrb = generator->ctx->shared->mrb; { /* precond check */ mrb_value exc = check_precond(mrb, generator); if (!mrb_nil_p(exc)) return exc; } h2o_mruby_send_chunked_close(generator); *next_action = H2O_MRUBY_CALLBACK_NEXT_ACTION_STOP; return mrb_nil_value(); }
static mrb_value send_chunked_eos_callback(h2o_mruby_context_t *mctx, mrb_value input, mrb_value *receiver, mrb_value args, int *run_again) { mrb_state *mrb = mctx->shared->mrb; h2o_mruby_generator_t *generator = h2o_mruby_get_generator(mrb, mrb_ary_entry(args, 0)); { /* precond check */ mrb_value exc = check_precond(mrb, generator); if (!mrb_nil_p(exc)) { *run_again = 1; return exc; } } h2o_mruby_send_chunked_close(generator); return mrb_nil_value(); }