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

標準で付いてるライブラリのcgi.rbを使えば楽そうだが、自分で作ってみる。
Perlでありがちな処理をRubyで再現。
Rubyの変数にnilがあるのを考慮しないと500 Internal Server Errorが出る。ややこしい。

#!/usr/local/bin/ruby

# コンソール上のデバッグ用に環境変数をセット
#ENV['CONTENT_LENGTH'] = "20"
#ENV['REQUEST_METHOD'] = "POST"

def decode
  require "kconv"
  $input = {}

  buf =  STDIN.read ENV['CONTENT_LENGTH'].to_i

  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
      $input[key] = value
    end
  }
end

if ENV["REQUEST_METHOD"] == "POST"
  decode
end

print <<END
Content-Type: text/html

<html>
<head>
<title>Rubyでフォームデータをデコードするデモ</title>
</head>
<body>
<h1>Rubyでフォームデータをデコードするデモ</h1>
<hr>
<form method=post>
<input type=checkbox name=check>
<input type=text name=text>
<input type=submit>
</form>
END

if $input != nil

  print "<hr>\n"
  print "<table border=1>\n"
  print "<tr><td><b>key</b></td><td><b>value</b></td></tr>\n"

  $input.each { |key, value|
    print "<tr><td>" + key + "</td><td>" + value + "</td></tr>\n"
  }

  print "</table>\n"

end

print <<END
</body>
</html>
END