要約
一般の CGI 環境で webrick ライブラリのサーブレットと同じように CGI スクリプトを書くためのライブラリです。サーバが WEBrick でなくても使うことが出来ます。
使い方
WEBrick のサーブレットを作成するのと同じように、WEBrick::CGI のサブクラスでメソッド do_GET や do_POST を定義することによって CGI スクリプトを書きます。
スクリプトの最後で WEBrick::CGI#start メソッドを呼ぶ必要があります。 WEBrick::CGI#start メソッドは service メソッドを呼び出し、service メソッドはリクエストに応じて do_XXX メソッドを呼び出します。このようにしてスクリプトは実行されます。
例:
#!/usr/local/bin/ruby require 'webrick/cgi' class MyCGI < WEBrick::CGI def do_GET(req, res) res["content-type"] = "text/plain" ret = "hoge\n" res.body = ret end end MyCGI.new.start()
do_XXX メソッド
do_XXX メソッドの XXX には GET, HEAD, POST, PUT, DELETE, OPTIONS が使用できます。
WEBrick::CGI のサブクラスで定義された do_XXX メソッドは WEBrick::CGI#service メソッドから HTTP のリクエストに応じて自動的に呼び出されます。なので WEBrick::CGI のサブクラスはこれらのメソッドを適切に実装しなければなりません。これらのメソッドの返り値は特に規定されていません。
WEBrick::CGI のサブクラスでは、クライアントが使う可能性のある RFC で定義された HTTP のメソッドはすべて実装する必要があります。クライアントからのリクエストに使われないと分かっているメソッドは実装しなくてもかまいません。実装されていない HTTP メソッドであった場合、WEBrick::CGI#service メソッドが例外を発生させます。
do_XXX メソッドが呼ばれた時点では、クライアントからのリクエストに含まれる Entity Body の読み込みはまだ行われていません。WEBrick::HTTPRequest#query, WEBrick::HTTPRequest#body などのメソッドが読ばれた時点で読み込みが行われます。クライアントから巨大なデータが送られてくることを考慮してユーザはプログラミングを行うべきです。
do_XXX メソッドには二つの引数があります。第一引数は、クライアントからのリクエストを表す WEBrick::HTTPRequest オブジェクトです。第二引数は、クライアントへのレスポンスを表す WEBrick::HTTPResponse オブジェクトです。
フォームフィールドの値を得る
フォームフィールドの値は WEBrick::HTTPRequest#query メソッドが返す Hash オブジェクトに収納されています。
require "webrick/cgi" class MyCGI < WEBrick::CGI def do_GET(req, res) req.query #=> Hash を返します。 req.query['q'] req.query['num'] end end MyCGI.new.start()
同じ名前のフィールドが複数ある場合、list メソッドや each_data メソッドを使います。
require "webrick/cgi" class MyCGI < WEBrick::CGI def do_GET(req, res) req.query['q'].list #=> フォームの値を保持した文字列の配列を返します。 end end MyCGI.new.start()
query メソッドが返す Hash オブジェクトのキーと値のうち値は WEBrick::HTTPUtils::FormData クラスのインスタンスになります。FormData クラスは String クラスのサブクラスです。
マルチパートフィールドの値を取得する(ファイル送信)
require "webrick/cgi" class MyCGI < WEBrick::CGI def do_GET(req, res) d = req.query['field_name'] #=> FormData クラスのインスタンス d.name #=> "field_name" d.filename #=> もしあればファイル名を返す。 d['content-type'] #=> ヘッダの値は [] メソッドで取得する d #=> 送られてきたファイルの中身 end end MyCGI.new.start()
クライアントにクッキーを渡す
require "webrick/cgi" class MyCGI < WEBrick::CGI def do_GET(req, res) c1 = WEBrick::Cookie.new("name1", "val1") c1.expires = Time.now + 30 res.cookies << c1 c2 = WEBrick::Cookie.new("name2", "val2") c2.expires = Time.now + 30 res.cookies << c2 end end MyCGI.new.start()
クライアントからクッキーを得る
require "webrick/cgi" class MyCGI < WEBrick::CGI def do_GET(req, res) req.cookies #=> WEBrick::Cookie オブジェクトの配列 c = req.cookies.find{|c| c.name == "name1" } #=> WEBrick::Cookie オブジェクト end end MyCGI.new.start()
CGI に関連する環境変数の値を取得する
CGI に関連する環境変数の値は直接 ENV から得る他に、 WEBrick::HTTPRequest オブジェクトの各メソッドから得ることができます。
require "webrick/cgi" class MyCGI < WEBrick::CGI def do_GET(req, res) req.content_length req.content_type req.path_info req.query_string req.peeraddr req.host req.user req.request_method req.script_name req.port end end MyCGI.new.start()
リンク
クラス
WEBrick::CGI | 一般の CGI 環境で WEBrick のサーブレットと同じように CGI スクリプトを書くためのクラスです。 |
例外クラス
WEBrick::CGI::CGIError | CGI に関係する例外クラスです。 |
同時にrequireされるライブラリ
webrick/config | |
webrick/cookie | |
webrick/htmlutils | HTML のためのユーティリティ関数を提供します。 |
webrick/httprequest | HTTP リクエストのためのクラスを提供するライブラリです。 |
webrick/httpresponse | HTTP のレスポンスを表すためのクラスを提供するライブラリです。 |
webrick/httpstatus | HTTP のステータスを表す例外クラスを提供します。 |
webrick/httputils | |
webrick/httpversion | |
webrick/log | |
webrick/utils |