--Multipart_Wed_Dec__6_13:14:23_2000-1
Content-Type: text/plain; charset=ISO-2022-JP


中島@ブレーンです。

mod_perlではPerlHandlerという指定で、要求したURLに関係なく特定のスクリプ
トにをさせる機あるようですが、これと似た機mod_rubyに追加しま
した。

パッチを添付しますので、本流に取り入れていただけたら嬉しいです。何か問題
があればご指摘下さい。

○ RubyHandlerとは

mod_rubyでは普通のCGIと同様に、ユーザの要求したURL$B<B9T$5$l$k%9%/%j%W%H
になります。もちろん一般的な用途ではでいいのですが、URLと関係なく特
定のスクリプトが常に実行されるようにしたいケースもあります。

1) URL上のパスをファイルシステム以外のものと対応づけて使いたい
2) 要求したスクリプトに前をしてから実行したり、実行後に口をしたえ
芥 全ての文縫淵咼押璽轡腑鵐弌爾箙告を付加したえ
刊 嗷ぢやerubyのようなHTML埋めこみ型言語のRubyによる実装

このようなケースでapacheのhttpd.confに

<Directory "/home/httpd/cgi-bin/ruby">
    SetHandler ruby-script
    RubyHandler /home/xxxx/ruby/handler.rb
</Directory>

と記垢襪函黛芍砠遲以下のパスを要求した場合はいつもmod_rubyの元で
/home/xxxx/ruby/handler.rbが実行されるようになります。このスクリプトには
ENV経由で、ユーザの要求したURL等が渡されますので、上記の1)〜4)のようなこ
とを実きます。知恵しだいで他にもいろいろ活用できるような気がします。

○ safe_levelについて

のmod_rubyでは、safe_levelを1にしてスクリプトを実行しますが、上記の
ような用途を考えると、safe_levelを0で実行したいケースもあります。で、
RubySafeLevelというディレクティブも追加しました。

<Directory "/home/httpd/cgi-bin/ruby">
    SetHandler ruby-script
    RubyHandler /home/xxxx/ruby/handler.rb
    RubySafeLevel 0
</Directory>

とすると、mod_ruby配下のスクリプトは全てsafe_level通常のrubyと同じ)で、
実行されます。つまり、handlerから他のスクリプトをloadすることなどができ
るようになります。当然ですが、危険性も高いので慎使用してください。

○ サンプルのハンドラー

http://localhost/cgi-bin/* で環境変数の一覧(リンク付き)が襯汽鵐廛襪
ハンドラースクリプトです。実在するファイルを指定した場合にはをRubyス
クリプトとみなして実行します。

------------------------------------------------------------
セgin

sample handler for mod_ruby

指定されたURIにファイルがあれば、を実行してスとともに
実行結果を示す。URIの最後が*ならば環境変数一覧を、以外は
環境変数名とみなし、値をする。

sample configuration

<Directory "/home/httpd/cgi-bin">
    SetHandler ruby-script
    RubyHandler /home/httpd/cgi-bin/handler.rb
    RubySafeLevel 0
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>

濺


puts "<h1>Hello World from handler.rb</h1>"
fname  NV["SCRIPT_FILENAME"]

begin
  f  ile.open(fname)
  puts "<h2>source of #{fname}</h2><hr>"
  puts "<pre>"
  f.each {|l|
    print $stdout.escape_html(l)
  }
  puts "</pre>"

  puts "<hr><h2>result of #{fname}is </h2><hr>"
  load fname 
  puts "<hr>end of #{fname}<br>bye bye"
rescue
  uri  stdout.uri
  puts "<h2>virtual path #{uri}</h2>"
  base  ri.split("/")[-1]
  if base "*"
    ENV.each{|k,v| puts "<a hrefk}>#{k}</a>"}
  else
    puts "#{base}ENV[base]}<br>"
  end
end

# work with only one child process of apache
puts "path of last time$fname}<br>"
puts "path of this timefname}"
$fname  name
------------------------------------------------------------

--Multipart_Wed_Dec__6_13:14:23_2000-1
Content-Type: application/octet-stream; type=patch
Content-Disposition: attachment; filename="mod_ruby-0.2.1.patch"
Content-Transfer-Encoding: 8bit

diff -uNr mod_ruby-0.2.1.org/apachelib.c mod_ruby/apachelib.c
--- mod_ruby-0.2.1.org/apachelib.c	Sat Oct 14 23:55:40 2000
+++ mod_ruby/apachelib.c	Wed Dec  6 11:11:56 2000
@@ -1,5 +1,5 @@
 /*
- * $Id: apachelib.c,v 1.12 2000/10/14 14:55:40 shugo Exp $
+ * $Id: apachelib.c,v 1.2 2000/12/06 02:11:56 tnaka Exp $
  * Copyright (C) 2000  ZetaBITS, Inc.
  * Copyright (C) 2000  Information-technology Promotion Agency, Japan
  *
diff -uNr mod_ruby-0.2.1.org/apachelib.h mod_ruby/apachelib.h
--- mod_ruby-0.2.1.org/apachelib.h	Sat Oct 14 13:27:56 2000
+++ mod_ruby/apachelib.h	Wed Dec  6 11:11:56 2000
@@ -1,5 +1,5 @@
 /*
- * $Id: apachelib.h,v 1.6 2000/10/14 04:27:56 shugo Exp $
+ * $Id: apachelib.h,v 1.2 2000/12/06 02:11:56 tnaka Exp $
  * Copyright (C) 2000  ZetaBITS, Inc.
  * Copyright (C) 2000  Information-technology Promotion Agency, Japan
  *
diff -uNr mod_ruby-0.2.1.org/mod_ruby.c mod_ruby/mod_ruby.c
--- mod_ruby-0.2.1.org/mod_ruby.c	Mon Oct 16 14:41:34 2000
+++ mod_ruby/mod_ruby.c	Wed Dec  6 11:20:37 2000
@@ -1,5 +1,5 @@
 /*
- * $Id: mod_ruby.c,v 1.24 2000/10/16 05:41:34 shugo Exp $
+ * $Id: mod_ruby.c,v 1.5 2000/12/06 02:20:37 tnaka Exp $
  * Copyright (C) 2000  ZetaBITS, Inc.
  * Copyright (C) 2000  Information-technology Promotion Agency, Japan
  *
@@ -83,6 +83,10 @@
      "Ruby ENV key and value" },
     {"RubyTimeOut", ruby_cmd_timeout, NULL, RSRC_CONF, TAKE1,
      "time to wait execution of ruby script"},
+    {"RubyHandler", ruby_cmd_handler, NULL, OR_ALL, TAKE1,
+     "path to Ruby handler script"},
+    {"RubySafeLevel", ruby_cmd_safe_level, NULL, OR_ALL, TAKE1,
+     "Ruby safe level(0:allow dangerous operation 1:prohibite it)"},
     {NULL}
 };
 
@@ -277,7 +281,7 @@
     orig_load_path  b_load_path;
     rb_global_variable(&orig_load_path);
 
-    rb_set_safe_level(1);
+    rb_set_safe_level(conf->safe_level);
 
     ruby_is_running  ;
 }
@@ -560,8 +564,15 @@
 {
     int state;
     request_data *data;
+    const char *handler  ULL ;
 
-    rb_load_protect(rb_str_new2(r->filename), 1, &state);
+    if(r->per_dir_config) {
+	ruby_dir_config *dconf  ruby_dir_config *) ap_get_module_config(r->per_dir_config,
+							 &ruby_module);
+	handler  conf->handler;
+    }
+
+    rb_load_protect(rb_str_new2(handler?handler:r->filename), 1, &state);
 #if defined(RUBY_RELEASE_CODE) && RUBY_RELEASE_CODE > 9990601
     rb_exec_end_proc();
 #endif
@@ -640,14 +651,10 @@
     int retval;
     const char *kcode_orig  ULL;
     long i;
+    const char *handler  ULL ;
 
     (void) ap_acquire_mutex(mod_ruby_mutex);
 
-    if (r->finfo.st_mode 0)
-	return NOT_FOUND;
-    if (S_ISDIR(r->finfo.st_mode))
-	return FORBIDDEN;
-
     if(r->per_dir_config) {
 	dconf  ruby_dir_config *) ap_get_module_config(r->per_dir_config,
 							 &ruby_module);
@@ -655,12 +662,19 @@
 	    kcode_orig  b_get_kcode();
 	    rb_set_kcode(dconf->kcode);
 	}
+	handler  conf->handler;
+    }
+    if (handler NULL) {
+      if (r->finfo.st_mode 0)
+	return NOT_FOUND;
+      if (S_ISDIR(r->finfo.st_mode))
+	return FORBIDDEN;
     }
 
     if ((retval  p_setup_client_block(r, REQUEST_CHUNKED_ERROR)))
 	return retval;
 
-    ap_chdir_file(r->filename);
+    ap_chdir_file(handler?handler:r->filename);
     setup_env(r, dconf);
     rb_load_path  b_ary_new();
     for (i  ; i < RARRAY(orig_load_path)->len; i++) {
diff -uNr mod_ruby-0.2.1.org/mod_ruby.h mod_ruby/mod_ruby.h
--- mod_ruby-0.2.1.org/mod_ruby.h	Thu Oct  5 00:38:46 2000
+++ mod_ruby/mod_ruby.h	Wed Dec  6 11:11:57 2000
@@ -1,5 +1,5 @@
 /*
- * $Id: mod_ruby.h,v 1.9 2000/10/04 15:38:46 shugo Exp $
+ * $Id: mod_ruby.h,v 1.3 2000/12/06 02:11:57 tnaka Exp $
  * Copyright (C) 2000  ZetaBITS, Inc.
  * Copyright (C) 2000  Information-technology Promotion Agency, Japan
  *
@@ -33,11 +33,13 @@
     array_header *required_files;
     table *env;
     int timeout;
+    int safe_level;
 } ruby_server_config;
 
 typedef struct {
     char *kcode;
     table *env;
+    char *handler;
 } ruby_dir_config;
 
 extern MODULE_VAR_EXPORT module ruby_module;
diff -uNr mod_ruby-0.2.1.org/ruby_config.c mod_ruby/ruby_config.c
--- mod_ruby-0.2.1.org/ruby_config.c	Thu Oct  5 00:38:46 2000
+++ mod_ruby/ruby_config.c	Wed Dec  6 11:11:57 2000
@@ -1,5 +1,5 @@
 /*
- * $Id: ruby_config.c,v 1.3 2000/10/04 15:38:46 shugo Exp $
+ * $Id: ruby_config.c,v 1.3 2000/12/06 02:11:57 tnaka Exp $
  * Copyright (C) 2000  ZetaBITS, Inc.
  * Copyright (C) 2000  Information-technology Promotion Agency, Japan
  *
@@ -46,6 +46,7 @@
     conf->required_files  p_make_array(p, 1, sizeof(char*));
     conf->env  p_make_table(p, 1);
     conf->timeout  R_DEFAULT_TIMEOUT;
+    conf->safe_level  ;
     return conf;
 }
 
@@ -56,6 +57,7 @@
 
     conf->kcode  ULL;
     conf->env  p_make_table(p, 5); 
+    conf->handler  ULL;
     return conf;
 }
 
@@ -68,6 +70,7 @@
 
     merged_conf->kcode  p_pstrdup(p, nconf->kcode);
     merged_conf->env  p_overlay_tables(p, nconf->env, pconf->env);
+    merged_conf->handler  p_pstrdup(p, nconf->handler);
     return (void *) merged_conf;
 }
 
@@ -133,6 +136,24 @@
 						    &ruby_module);
 
     conf->timeout  toi(arg);
+    return NULL;
+}
+
+const char *ruby_cmd_handler(cmd_parms *cmd, void *config, char *arg)
+{
+    ruby_dir_config *conf  ruby_dir_config *) config;
+
+    conf->handler  p_pstrdup(cmd->pool, arg);
+    return NULL;
+}
+
+const char *ruby_cmd_safe_level(cmd_parms *cmd, void *config, char *arg)
+{
+    ruby_server_config *conf +	(ruby_server_config *) ap_get_module_config(cmd->server->module_config,
+						    &ruby_module);
+
+    conf->safe_level  toi(arg);
     return NULL;
 }
 
diff -uNr mod_ruby-0.2.1.org/ruby_config.h mod_ruby/ruby_config.h
--- mod_ruby-0.2.1.org/ruby_config.h	Thu Oct  5 00:38:46 2000
+++ mod_ruby/ruby_config.h	Wed Dec  6 11:11:57 2000
@@ -1,5 +1,5 @@
 /*
- * $Id: ruby_config.h,v 1.2 2000/10/04 15:38:46 shugo Exp $
+ * $Id: ruby_config.h,v 1.3 2000/12/06 02:11:57 tnaka Exp $
  * Copyright (C) 2000  ZetaBITS, Inc.
  * Copyright (C) 2000  Information-technology Promotion Agency, Japan
  *
@@ -34,6 +34,9 @@
 const char *ruby_cmd_pass_env(cmd_parms*, void*, char*);
 const char *ruby_cmd_set_env(cmd_parms*, ruby_dir_config*, char*, char*);
 const char *ruby_cmd_timeout(cmd_parms*, void*, char*);
+const char *ruby_cmd_handler(cmd_parms*, void*, char*);
+const char *ruby_cmd_safe_level(cmd_parms*, void*, char*);
+
 
 #endif /* !RUBY_CONFIG_H */
 

--Multipart_Wed_Dec__6_13:14:23_2000-1
Content-Type: text/plain; charset=ISO-2022-JP


------------------------------------------------------------
中島 拓 (株)ブレーン 研究部 (p95 / brain-tokyo.co.jp)
http://www03.u-page.so-net.ne.jp/dc4/tnaka/

--Multipart_Wed_Dec__6_13:14:23_2000-1--