原です。

|ruby にはまるちょっと前に Perl で作られた telnet 版を友人に見せてもら
|い、その時に HTTP 版を作ろうと話していたのですが、ruby では原さんのサ
|ンプルのおかげで簡単に出来てなかなか嬉しかったです。ありがとうございま
|す>原さん

どうもです。

ところで、私も日曜にマニュアルサーバーを書いたんですけど、どう
しても250行を切らないんです。で、使い回しの出来そうな部分は
標準ライブラリに突っ込んでもらおうかなと。(^^;

で、本来は http-lib.rb, html-lib.rb などという立派な名前のライ
ブラリを作りたいのですが、、、と言いつつ時間がないので放ったま
まです。そこでさしあたって、細かい関数をモジュールとして作って
しまったらどうでしょうか。名前は後で邪魔にならない様にあえてせ
こくして、

module HttpUtil (in httputil.rb)
module HtmlUtil (in htmlutil.rb)

とする。例えば HttpUtil の中には cgi-lib.rb の中の

  def escape(str)
    str.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
  end

  def unescape(str)
    str.gsub(/\+/, ' ').gsub(/%([0-9a-fA-F]{2})/){ [$1.hex].pack("c") }
  end

などを入れます。HtmlUtil の中にはやはり cgi-lib.rb の中に見える

  def quote(string)
    m = string.dup
    m.gsub!(/&/, '&')
    m.gsub!(/</, '&lt;')
    m.gsub!(/>/, '&gt;')
    m
  end

# 今きづいたけど、gsub!(/&/, ..) は一番最後にすべきですね

などを入れます。差し当たっての前提措置を標準ライブラリに入れ
るのは気分は良くないかも知れないけど、気楽に書き足せるし、後
で改めて大きなライブラリを書くときも邪魔にはならないのではな
いかな。どうでしょうか?


あ、それから cgi-lib.rb ですが、require "shellwords.rb" する
のは必要な時にだけにした方がいいかも。