= 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> }}}