Tenarai::CGI::Request

CGI のリクエストを扱うクラス

概要

CGI の環境変数や CGI プログラムにアップロードされたファイル、URL のクエリーやクッキーといったクライアントからのリクエストやサーバの実行環境などのデータを CGI プログラムで扱いやすいハッシュや配列、Tenarai::CGI::Query といったオブジェクトに変換してくれるクラスです。変換されたデータへは各メソッドを経由してアクセスすることが出来ます。

以下の例では request ブロック変数が Tenarai::CGI::Request オブジェクトになります。

まずは、HTTP の GET や POST などのリクエストメソッドを取得するメソッドですが、その名も method です。HTTP のメソッド名は全て小文字に変換されています。

  1. require 'tenarai/cgi'
  2. Tenarai::CGI.new do |request, response|
  3. response.code = 200
  4. response['content-type'] = 'text/plain'
  5. response.body << request.method
  6. end

実行結果

Status: 200 OK
Content-Type: text/plain

get

CGI 環境変数へは header メソッドが返すハッシュオブジェクトまたは、[]メソッドでアクセスすることができます。環境変数の名前は全て小文字に変換されています。

なぜ環境変数の名前を小文字に変換したかというと、大文字は入力するのが面倒だからです。それから、そのままだと Tenarai::CGI::Request#header (リクエストヘッダー) のキーは全て大文字なのに、Tenarai::CGI::Response#header (レスポンスヘッダー) のキーを全て大文字にするのが一般的でないという非対称が気持悪かったのです。ここは両方小文字にして、内部で変換して気持悪くないようにしようと思ったのですが、CGI の環境変数が大文字でないという気持悪さが新たに...。結局のところ入力が楽な小文字に統一なんてどうだろうかと思い直したまま今に至ってしまいました。

あと、環境変数の名前を :request_method のようにシンボルにしようとしたこともあったのですが、Tenarai::CGI::Response#header (レスポンスヘッダー) の場合はキーの名前が content-type とか "-" がよく使われるので、こっちもシンボルにしてしまうと、それこそいちいち :"content-type" としないと対称的にならないのでやめました。

そういうことで、リクエストもレスポンスも、どちらもヘッダーを扱うハッシュのキーは文字列です。

  1. require 'tenarai/cgi'
  2. Tenarai::CGI.new do |request, response|
  3. response.code = 200
  4. response['content-type'] = 'text/plain'
  5. response.body << request['request_methd'] + "\n"
  6. request.header.each do |key, val|
  7. response.body << "#{key}: #{val}\n"
  8. end
  9. end

実行結果 (実行環境によって異なります)

Status: 200 OK
Content-Type: text/plain

GET
request_method: GET
query_string: a=123&b=456&c=789
...以下省略...

CGI のクエリー文字列や、フォームから GET で送信された文字列は query という Tenarai::CGI::Query オブジェクトを通してアクセスすることが出来ます。

  1. require 'tenarai/cgi'
  2. Tenarai::CGI.new do |request, response|
  3. response.code = 200
  4. response['content-type'] = 'text/plain'
  5. response.body << "query_string: %s\n" % request.header['query_string']
  6. response.body << "a: %s\n" % request.query['a']
  7. response.body << "b: %s\n" % request.query['b']
  8. response.body << "c: %s\n" % request.query['c']
  9. end

実行結果

Status: 200 OK
Content-Type: text/plain

query_string: a=123&b=456&c=789
a: 123
b: 456
c: 789

フォームから PUSH で送信された値やアップロードされたファイルは content という Tenarai::CGI::Query オブジェクトを通してアクセスすることが出来ます。

  1. require 'tenarai/cgi'
  2. Tenarai::CGI.new do |request, response|
  3. response.code = 200
  4. response['content-type'] = 'text/plain'
  5. response.body << request.content['a']
  6. response.body << "\n"
  7. response.body << request.content['file'][:filename]
  8. response.body << "\n"
  9. response.body << request.content['file'][:content_type]
  10. response.body << "\n"
  11. response.body << request.content['file'][:tmpfile]
  12. response.body << "\n"
  13. end

実行結果

ブラウザから返されたクッキーの値は cookie というTenarai::CGI::Query オブジェクトを通してアクセスすることが出来ます。

  1. require 'tenarai/cgi'
  2. Tenarai::CGI.new do |request, response|
  3. response.code = 200
  4. response['content-type'] = 'text/plain'
  5. response.body << "http_cookie: %s\n" % request.header['htp_cookie']
  6. response.body << "a: %s\n" % request.cookie['a']
  7. end

実行結果

Status: 200 OK
Content-Type: text/plain

http_cookie: a=123
a: 123

クラスメソッド

new(stdin, env, param={})

stdin に CGI の標準入力を env に CGI の環境変数を指定します。param には Tenarai::CGI.new と同じパラメータが指定されます。このパラメータはアップロードファイルを保存するための一時ファイルを作成するときに使われます。

メソッド

method

HTTP のメソッド名が小文字の文字列で返されます。

ブラウザから送信されてきたクッキーの内容が Tenarai::CGI::Query オブジェクトとして返されます。

query

URL のクエリー文字列が Tenarai::CGI::Query オブジェクトとして返されます。

header

CGI の環境変数がハッシュオブジェクトとして返されます。

[](key)

key で指定された名前の CGI 環境変数の値が返されます。

content

HTTP POST で送信されたフォームの内容やアップロードされたファイルの情報が Tenarai::CGI::Query オブジェクトとして返されます。

body

content のエイリアスです。


AdSense is disabled. Please check setting.