static void on_dispose(void *_ctx) { struct st_h2o_mruby_http_request_context_t *ctx = _ctx; /* clear the refs */ if (ctx->client != NULL) { h2o_http1client_cancel(ctx->client); ctx->client = NULL; } if (!mrb_nil_p(ctx->refs.request)) DATA_PTR(ctx->refs.request) = NULL; if (!mrb_nil_p(ctx->refs.input_stream)) DATA_PTR(ctx->refs.input_stream) = NULL; /* clear bufs */ h2o_buffer_dispose(&ctx->req.buf); h2o_buffer_dispose(&ctx->resp.after_closed); /* notify the app, if it is waiting to hear from us */ if (!mrb_nil_p(ctx->receiver)) { mrb_state *mrb = ctx->generator->ctx->mrb; int gc_arena = mrb_gc_arena_save(mrb); h2o_mruby_run_fiber(ctx->generator, detach_receiver(ctx), create_downstream_closed_exception(mrb), gc_arena, NULL); } }
static void do_close(h2o_generator_t *generator, h2o_req_t *req) { struct rp_generator_t *self = (void*)generator; if (self->client != NULL) { h2o_http1client_cancel(self->client); self->client = NULL; } }
static void on_generator_dispose(void *_self) { struct rp_generator_t *self = _self; if (self->client != NULL) { h2o_http1client_cancel(self->client); self->client = NULL; } h2o_buffer_dispose(&self->last_content_before_send); h2o_doublebuffer_dispose(&self->sending); }