#include "shrpx_mruby_module.h"
#include <array>
#include <mruby/variable.h>
#include <mruby/string.h>
#include <mruby/hash.h>
#include <mruby/array.h>
#include "shrpx_mruby.h"
#include "shrpx_mruby_module_env.h"
#include "shrpx_mruby_module_request.h"
#include "shrpx_mruby_module_response.h"
namespace shrpx {
namespace mruby {
namespace {
mrb_value create_env(mrb_state *mrb) {
auto module = mrb_module_get(mrb, "Nghttpx");
auto env_class = mrb_class_get_under(mrb, module, "Env");
auto request_class = mrb_class_get_under(mrb, module, "Request");
auto response_class = mrb_class_get_under(mrb, module, "Response");
auto env = mrb_obj_new(mrb, env_class, 0, nullptr);
auto req = mrb_obj_new(mrb, request_class, 0, nullptr);
auto resp = mrb_obj_new(mrb, response_class, 0, nullptr);
mrb_iv_set(mrb, env, mrb_intern_lit(mrb, "req"), req);
mrb_iv_set(mrb, env, mrb_intern_lit(mrb, "resp"), resp);
return env;
}
}
void delete_downstream_from_module(mrb_state *mrb, Downstream *downstream) {
auto module = mrb_module_get(mrb, "Nghttpx");
auto env = mrb_obj_iv_get(mrb, reinterpret_cast<RObject *>(module),
mrb_intern_lit(mrb, "env"));
if (mrb_nil_p(env)) {
return;
}
mrb_iv_remove(mrb, env, intern_ptr(mrb, downstream));
}
mrb_value init_module(mrb_state *mrb) {
auto module = mrb_define_module(mrb, "Nghttpx");
mrb_define_const(mrb, module, "REQUEST_PHASE",
mrb_fixnum_value(PHASE_REQUEST));
mrb_define_const(mrb, module, "RESPONSE_PHASE",
mrb_fixnum_value(PHASE_RESPONSE));
init_env_class(mrb, module);
init_request_class(mrb, module);
init_response_class(mrb, module);
return create_env(mrb);
}
mrb_value create_headers_hash(mrb_state *mrb, const HeaderRefs &headers) {
auto hash = mrb_hash_new(mrb);
for (auto &hd : headers) {
if (hd.name.empty() || hd.name[0] == ':') {
continue;
}
auto ai = mrb_gc_arena_save(mrb);
auto key =
mrb_str_new(mrb, hd.name.data(), static_cast<mrb_int>(hd.name.size()));
auto ary = mrb_hash_get(mrb, hash, key);
if (mrb_nil_p(ary)) {
ary = mrb_ary_new(mrb);
mrb_hash_set(mrb, hash, key, ary);
}
mrb_ary_push(
mrb, ary,
mrb_str_new(mrb, hd.value.data(), static_cast<mrb_int>(hd.value.size())));
mrb_gc_arena_restore(mrb, ai);
}
return hash;
}
}
}