Beispiel #1
0
void h2o_mruby_send_chunked_init_context(h2o_mruby_shared_context_t *shared_ctx)
{
    mrb_state *mrb = shared_ctx->mrb;

    h2o_mruby_eval_expr_location(mrb, H2O_MRUBY_CODE_CHUNKED, "(h2o)lib/handler/mruby/embedded/chunked.rb", 1);
    h2o_mruby_assert(mrb);

    mrb_define_method(mrb, mrb->kernel_module, "_h2o_send_chunk", send_chunked_method, MRB_ARGS_ARG(1, 0));
    h2o_mruby_define_callback(mrb, "_h2o_send_chunk_eos", send_chunked_eos_callback);

    mrb_ary_set(mrb, shared_ctx->constants, H2O_MRUBY_CHUNKED_PROC_EACH_TO_FIBER,
                mrb_funcall(mrb, mrb_top_self(mrb), "_h2o_chunked_proc_each_to_fiber", 0));
    h2o_mruby_assert(mrb);
}
Beispiel #2
0
void h2o_mruby_http_request_init_context(h2o_mruby_context_t *ctx)
{
    mrb_state *mrb = ctx->mrb;
    struct RClass *module, *klass;

    mrb_define_method(mrb, mrb->kernel_module, "http_request", http_request_method, MRB_ARGS_ARG(1, 2));

    module = mrb_define_module(mrb, "H2O");
    klass = mrb_define_class_under(mrb, module, "HttpRequest", mrb->object_class);
    mrb_ary_set(mrb, ctx->constants, H2O_MRUBY_HTTP_REQUEST_CLASS, mrb_obj_value(klass));

    klass = mrb_define_class_under(mrb, module, "HttpInputStream", mrb->object_class);
    mrb_ary_set(mrb, ctx->constants, H2O_MRUBY_HTTP_INPUT_STREAM_CLASS, mrb_obj_value(klass));

    h2o_mruby_define_callback(mrb, "_h2o__http_join_response", H2O_MRUBY_CALLBACK_ID_HTTP_JOIN_RESPONSE);
    h2o_mruby_define_callback(mrb, "_h2o__http_fetch_chunk", H2O_MRUBY_CALLBACK_ID_HTTP_FETCH_CHUNK);

    h2o_mruby_eval_expr(mrb, "module H2O\n"
                             "  class HttpRequest\n"
                             "    def join\n"
                             "      if !@resp\n"
                             "        @resp = _h2o__http_join_response(self)\n"
                             "      end\n"
                             "      @resp\n"
                             "    end\n"
                             "    def _set_response(resp)\n"
                             "      @resp = resp\n"
                             "    end\n"
                             "  end\n"
                             "  class HttpInputStream\n"
                             "    def each\n"
                             "      while c = _h2o__http_fetch_chunk(self)\n"
                             "        yield c\n"
                             "      end\n"
                             "    end\n"
                             "    def join\n"
                             "      s = \"\"\n"
                             "      each do |c|\n"
                             "        s << c\n"
                             "      end\n"
                             "      s\n"
                             "    end\n"
                             "  end\n"
                             "end");
    h2o_mruby_assert(mrb);
}
Beispiel #3
0
void h2o_mruby_send_chunked_init_context(h2o_mruby_shared_context_t *shared_ctx)
{
    mrb_state *mrb = shared_ctx->mrb;

    mrb_define_method(mrb, mrb->kernel_module, "_h2o_send_chunk", send_chunked_method, MRB_ARGS_ARG(1, 0));
    h2o_mruby_define_callback(mrb, "_h2o_send_chunk_eos", H2O_MRUBY_CALLBACK_ID_SEND_CHUNKED_EOS);
    mrb_ary_set(mrb, shared_ctx->constants, H2O_MRUBY_CHUNKED_PROC_EACH_TO_FIBER,
                h2o_mruby_eval_expr(mrb, "Proc.new do |src|\n"
                                         "  fiber = Fiber.new do\n"
                                         "    src.each do |chunk|\n"
                                         "      _h2o_send_chunk(chunk)\n"
                                         "    end\n"
                                         "    _h2o_send_chunk_eos()\n"
                                         "  end\n"
                                         "  fiber.resume\n"
                                         "end"));
    h2o_mruby_assert(mrb);
}