From: Shugo Maeda Date: 1999-02-19T17:23:34+09:00 Subject: [ruby-dev:5333] Re: mod_ruby-0.0.2(Re: [req] cgi-lib NPH support) 前田です。 Wakou Aoyama writes: > > 特に環境変数で渡す必要もないように思ったので、MOD_RUBYという > > 定数を定義しました。 > > apache の起動時に怒られました。 > > Cannot load /usr/lib/apache/1.3/mod_ruby.so into server: /usr/lib/apache/1.3/mod_ruby.so: undefined symbol: rb_defin_global_const ああ、すみませんm(..)m > > if defined?(MOD_RUBY)でいけると思います。 > > # 今はtrueにしてあるのですが、"mod_ruby/0.0.6"のような文字列 > > # にした方がよいですか? > > そうですね。0.0.4 --> 0.0.5 でも Apache::send_header が > Apache::send_http_header になったりと変更がありましたし、バージョンは > 欲しいです。 これも含めたパッチです。 diff -u -r1.2 mod_ruby.c --- mod_ruby.c 1999/02/18 18:10:44 1.2 +++ mod_ruby.c 1999/02/19 07:37:10 @@ -39,7 +39,9 @@ #include "apache.h" #include "mod_ruby.h" +#ifdef MULTITHREAD static mutex *mod_ruby_mutex = NULL; +#endif static int ruby_is_running = 0; /* copied from eval.c */ @@ -132,7 +134,7 @@ ruby_init(); ruby_script("mod_ruby"); - rb_defin_global_const("MOD_RUBY", Qtrue); + rb_define_global_const("MOD_RUBY", rb_str_new2(MOD_RUBY_STRING_VERSION)); rb_set_safe_level(1); rb_define_global_function("p", f_p, -1); rb_define_global_function("exit", f_exit, -1); diff -u -r1.2 apache.c --- apache.c 1999/02/18 18:10:44 1.2 +++ apache.c 1999/02/19 07:36:30 @@ -130,6 +130,27 @@ return Qnil; } +static VALUE writable_addstr(VALUE out, VALUE str) +{ + rb_write(out, str); + return out; +} + +static VALUE writable_flush(VALUE out) +{ + return out; +} + +static VALUE writable_get_sync(VALUE io) +{ + return Qfalse; +} + +static VALUE writable_set_sync(VALUE io, VALUE mode) +{ + return mode; +} + VALUE ruby_create_request(request_rec *r) { VALUE result; @@ -175,7 +196,6 @@ { VALUE assoc; request_rec *r; - char *val; array_header *hdrs_arr; table_entry *hdrs; int i; @@ -193,6 +213,42 @@ return Qnil; } +static VALUE request_each_key(VALUE self) +{ + request_rec *r; + array_header *hdrs_arr; + table_entry *hdrs; + int i; + + Data_Get_Struct(self, request_rec, r); + hdrs_arr = ap_table_elts(r->headers_in); + hdrs = (table_entry *) hdrs_arr->elts; + for (i = 0; i < hdrs_arr->nelts; i++) { + if (hdrs[i].key == NULL) + continue; + rb_yield(rb_str_new2(hdrs[i].key)); + } + return Qnil; +} + +static VALUE request_each_value(VALUE self) +{ + request_rec *r; + array_header *hdrs_arr; + table_entry *hdrs; + int i; + + Data_Get_Struct(self, request_rec, r); + hdrs_arr = ap_table_elts(r->headers_in); + hdrs = (table_entry *) hdrs_arr->elts; + for (i = 0; i < hdrs_arr->nelts; i++) { + if (hdrs[i].key == NULL) + continue; + rb_yield(hdrs[i].val ? rb_str_new2(hdrs[i].val) : Qnil); + } + return Qnil; +} + static VALUE request_write(VALUE self, VALUE str) { VALUE buff = rb_iv_get(self, "buff"); @@ -311,14 +367,21 @@ rb_define_method(rb_mWritable, "print", writable_print, -1); rb_define_method(rb_mWritable, "printf", writable_printf, -1); rb_define_method(rb_mWritable, "puts", writable_puts, -1); + rb_define_method(rb_mWritable, "<<", writable_addstr, 1); + rb_define_method(rb_mWritable, "flush", writable_flush, 0); + rb_define_method(rb_mWritable, "sync", writable_get_sync, 0); + rb_define_method(rb_mWritable, "sync=", writable_set_sync, 1); rb_cRequest = rb_define_class_under(rb_mApache, "Request", rb_cObject); + rb_include_module(rb_cRequest, rb_mEnumerable); rb_include_module(rb_cRequest, rb_mWritable); rb_undef_method(CLASS_OF(rb_cRequest), "new"); rb_define_method(rb_cRequest, "[]", request_aref, 1); rb_define_method(rb_cRequest, "[]=", request_aset, 2); rb_define_method(rb_cRequest, "each_header", request_each_header, 0); rb_define_alias(rb_cRequest, "each", "each_header"); + rb_define_method(rb_cRequest, "each_key", request_each_key, 0); + rb_define_method(rb_cRequest, "each_value", request_each_value, 0); rb_define_method(rb_cRequest, "write", request_write, 1); rb_define_method(rb_cRequest, "putc", request_putc, 1); rb_define_method(rb_cRequest, "content_type", -- 前田 修吾