2001-04-10 (Tue) [長年日記]
_ mod_ruby
mod_rubyで、Rubyでリクエストハンドラを書けるようにしてcvsにcommitした。
# cat.rb require "singleton" class Cat include Singleton def handler(r) begin body = open(r.filename).read r.content_type = "text/plain" r.send_http_header r.print(body) return Apache::OK rescue Errno::ENOENT return Apache::NOT_FOUND rescue Errno::EACCES return Apache::FORBIDDEN rescue return Apache::SERVER_ERROR end end end
みたいなスクリプトを書いといて、httpd.confで、
RubyAddPath /home/shugo/ruby RubyRequire cat <Location /cat> SetHandler ruby-object RubyHandler Cat.instance </Location>
なんて設定をしておくと、/cat/以下にアクセスした場合はCat#handlerが呼ばれる。 別にSingleton使わなくても、Object.newして特異メソッド定義するだけでもいいけど。
後は他のハンドラも定義できるようにしなきゃな。
_ mod_rd2html.rb
ちょっと実用的なモジュールをRubyで書いてみたり。 これはRDをHTMLに変換するモジュール。
# mod_rd2html.rb require "singleton" require "rd/rdfmt" require "rd/rd2html-lib" class RD2HTML include Singleton def handler(r) begin open(r.filename) do |f| tree = RD::RDTree.new(f) visitor = RD::RD2HTMLVisitor.new r.content_type = "text/html" r.send_http_header r.print(visitor.visit(tree)) return Apache::OK end rescue Errno::ENOENT return Apache::NOT_FOUND rescue Errno::EACCES return Apache::FORBIDDEN rescue return Apache::SERVER_ERROR end end end
たとえば、httpd.confで、
RubyRequire mod_rd2html <Location /rd> SetHandler ruby-object RubyHandler RD2HTML.instance </Location>
なんて設定をすると、http://www.foo.org/rd/foo.rdでfoo.rdをRDに変換した結果が 見られるわけ。 ERbを使うモジュールなんかも簡単にできそうだな。