RubyでCGIスクリプトを作る下準備・フォームデータを受け取る・改

前回 http://d.hatena.ne.jp/BeForU/20040628#p2 の改良。
GETとPOSTの両方に対応。
将来、掲示スクリプトに使えるように"<"や">"を置き換える。

def tag(str)
  str.gsub!("&", "&amp;")
  str.gsub!("<", "&lt;")
  str.gsub!(">", "&gt;")
  str.gsub!("\"", "&quot;")
  str.gsub!("\x0d\x0a", "\x0a")
  str.gsub!("\x0d", "<br>")
  str.gsub!("\x0a", "<br>")
  str
end

# コンソール上のデバッグ用に環境変数をセット
#ENV['QUERY_STRING'] = "a=%A5%C6%A5%B9%A5%C8&b=t+e%0As+t"
#ENV['CONTENT_LENGTH'] = "30"
#ENV['REQUEST_METHOD'] = "GET"

def decode(method)
  require "kconv"
  $input = {}

  if method == "GET"
    buf = ENV['QUERY_STRING']
  elsif method == "POST"
    buf =  STDIN.read ENV['CONTENT_LENGTH'].to_i
  end

  if buf == nil
    return
  end

  buf.split("&").each { |str|
    key   = str.split("=")[0]
    value = str.split("=")[1]

    if value != nil
      value.tr!("+", " ")
      value.gsub!(/%([0-9a-fA-F]{2})/) {
        [$1.hex].pack("C")
      }
      value = value.toeuc # 文字コードEUC
      value = tag(value)
      $input[key] = value
    end
  }
end