本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはWEB+DB PRESS Vol.
なお本稿のサンプルコードは、
幅広く使われるようになったPSGI/Plack
本連載でPSGI
それから4年経ち、
PSGIの仕様の復習
PSGIはWebアプリケーションと実行環境のWebサーバとをつなぐための仕様です。PythonのWSGI
ここでは2013年11月時点の最新であるバージョン1.
PSGIアプリケーション
以下が最もシンプルなPSGIに対応したアプリケーションです。
my $app = sub {
my $env = shift;
# アプリケーションの処理
return [200,
['Content-Type'=>'text/plain'],
["Hello World\n"]
];
};
PSGIアプリケーションはPerlのコードリファレンスとして実装します。実行時に引数として$env
と呼ばれるリクエストの情報が入ったハッシュリファレンスが渡されます。レスポンスは配列のリファレンスを返しています。
リクエスト
リクエスト情報が入るハッシュリファレンスには表1のようなデータが含まれています。大きく分けて、
- CGI仕様
(RFC 3875) で規定されるリクエスト情報 - POSTリクエストのデータ読み込みや、
ファイルハンドルやエラー出力のためのファイルハンドル - PSGIのオプション
の3つになります。通常のハッシュリファレンスですので、
my $ua = $env->{USER_AGENT};
とすることでデータにアクセスできます。
キー | 内容 |
---|---|
REQUEST_ | リクエストメソッド |
REQUEST_ | リクエストがあったURI |
QUERY_ | リクエストのクエリパラメータ |
SERVER_ | HTTP/ |
HTTP_* | リクエストヘッダ |
psgi. | POSTデータを読み込むためのファイルハンドルオブジェクト |
psgi. | エラーに使うファイルハンドルオブジェクト |
psgi. | リクエストのURIスキーマ |
psgi. | PSGI仕様のバージョン |
psgi. | PSGIサーバがサポートしている機能についてのフラグ |
psgi. | |
psgi. |
レスポンス
現在のPSGIの仕様では2種類のレスポンスが規定されています。一つは標準的な配列のリファレンス、
標準レスポンス
PSGIの標準的なレスポンスは配列のリファレンスで表現します。配列は3つの要素から構成されます。
my $res = [
200, ――(1)
[ ┓
"Content-Type"=>"text/plain", |
"Content-Length"=> 13, |―(2)
], ┛
[ ┓
"Hello World\n", |
"WEB+DB PRESS\n" |―(3)
] ┛
];
open my $fh, "</path/to/file";
my $res = [ 200,
["Content-Type"=>"image/jpg,],
$fh ];
容量の大きなコンテンツを返す際に、
遅延レスポンス
PSGIでサポートされるもう一つのレスポンスの形式が、
リスト1は、responder
に渡して実行します。ここで初めてクライアントにレスポンスが返ります。
use AnyEvent::HTTP;
my $app = sub {
my $env = shift;
return sub {
my $responder = shift; ――(1)
http_get('http://gihyo.jp/',sub {
my ($body, $header) = @_;
$responder->([ 200, [], [ $body ] ]); ――(2)
});
};
};
PlackとPSGI
本節の最後としてPlackとPSGIの関係を整理します。PSGIはここまで書いてきたとおり、
PlackはPSGIの1つの実装ですので、

<続きの