Show page source of Tenarai_CGI_Request #13902

= Tenarai::CGI::Request

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

== 概要

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

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

{{{ code ruby
require 'tenarai/cgi'

Tenarai::CGI.new do |request, response|
  response.code = 200
  response['content-type'] = 'text/plain'

  response.body << request.method
end
}}}

実行結果

{{{
Status: 200 OK
Content-Type: text/plain

get
}}}

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

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

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

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

{{{ code ruby
require 'tenarai/cgi'

Tenarai::CGI.new do |request, response|
  response.code = 200
  response['content-type'] = 'text/plain'

  request.header.each do |key, val|
    response.body << "#{key}: #{val}\n"
  end
end
}}}

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

{{{
Status: 200 OK
Content-Type: text/plain

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

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

{{{ code ruby
require 'tenarai/cgi'

Tenarai::CGI.new do |request, response|
  response.code = 200
  response['content-type'] = 'text/plain'

  response.body << "query_string: %s\n" % request.header['query_string']
  response.body << "a: %s\n" % request.query['a']
  response.body << "b: %s\n" % request.query['b']
  response.body << "c: %s\n" % request.query['c']
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 Tenarai::CGI::Query] オブジェクトを通してアクセスすることが出来ます。

{{{ code ruby
require 'tenarai/cgi'

Tenarai::CGI.new do |request, response|
  response.code = 200
  response['content-type'] = 'text/plain'

  response.body << request.content['a']
  response.body << "\n"
  response.body << request.content['file'][:filename]
  response.body << "\n"
  response.body << request.content['file'][:content_type]
  response.body << "\n"
  response.body << request.content['file'][:tmpfile]
  response.body << "\n"
end
}}}

実行結果

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

{{{ code ruby
require 'tenarai/cgi'

Tenarai::CGI.new do |request, response|
  response.code = 200
  response['content-type'] = 'text/plain'

  response.body << request.cookie['a']
  response.body << "\n"
end
}}}

実行結果

{{{
Status: 200 OK
Content-Type: text/plain

123
}}}

== クラスメソッド

=== new(stdin, env, param={})

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

== メソッド

=== method

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

=== cookie

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

=== query

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

=== header

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

=== content

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

=== body

content のエイリアスです。

[[BR]]

{{{ GoogleAdsense
<script type="text/javascript"><!--
google_ad_client = "pub-7795188745549116";
/* 468x60, 作成済み 08/03/06 */
google_ad_slot = "3502815244";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
}}}