PSGI

PSGI (Perl)

[8] PSGI は、 Perl における HTTPサーバーWebアプリケーションとのインターフェイス仕様です。 Tatsuhiko Miyagawa らにより制定、実装されました。

[9] WSGI に強い影響を受けており、これを Perl に移植したものとなっています。

[10] 現在では多くの PerlHTTPサーバーWebアプリケーションが対応しています。

仕様書

プロトコル

[16]

[11] 環境 (environment) は、 CGIメタ変数の流れを汲むハッシュ参照で、 HTTPサーバーから Webアプリケーションへの伝達に使われます。

限界

[12] サーバーアプリケーションの責務が明確に定められていません。例えば、 ヘッダー値に不適切な改行が含まれると HTTPメッセージとして正しく解釈できなくなり、 ときにセキュリティーの問題を引き起こすことがありますが、 これをどちらが保証するべきなのか、サーバーだとしたらどのように処理するべきなのか (黙って訂正するべきなのか、何らかの方法でエラーとするべきなのか) がはっきりしていません。

[13] HTTP の機能のうち、 理由句には対応していません。 CGI その他の既存の手法に対する明白な欠点です。

[14] WebSocket を扱うことができません。いくつかの実装は ad hoc な対応をしていますが、標準化されていないだけでなく強引な方法を採っています。

[18] CONNECT を扱うことができません。

[15] server push を扱うことができません。

[17] 要求の受信中にクライアントとの接続が切断された場合や、 長い処理の途中でサーバー再起動されようとしている時など、 中断した方が良いかもしれない場合にその旨をサーバーからアプリケーションに伝達する手段がありません。

.psgi ファイル

[19] PSGIアプリケーションを返す Perlスクリプト拡張子.psgiファイル >>25 とすることがよくあるようです。PSGI を実装したサーバーは、 指定されたファイルdo などによって読み込み、 得られたコード参照アプリケーションとして実行することが期待されています。

[20] CGIスクリプト拡張子 .cgiファイルとする慣習に倣ったもののようです。

実装

[28] PSGI の開発者らによる Plack日本では広く用いられています。 StarletTwiggy のような主要な PSGI 対応Webサーバーや、 各種 WAFPlack を利用しており、一般の開発者が PSGIPlack を混同する元凶となっています。

[30] 実際には Plack を使わない PSGI もいくつか存在し、使われています。

[31] ただしミドルウェアは、それ自体は PSGI で規定された概念ですが、実装上は Plack を使い Plack::Middleware という名前を翳したものが多いです。 それらが Plack 以外の PSGI の実装と現実的に共存できるのかは不明瞭です。

関連

[29] Perl5 とは似て非なる言語 Perl6 向けには、 P6W という似て非なる API があります。当初は P6SGI と呼ばれ、 PSGI の影響を強く受けていました。現在も PSGI Protocol という動作モードが API の一部を構成していますが、類似性は薄まっています。 PSGI が扱えない WebSocket への対応や、 HTTP/2 の扱いの規定もあります。 仕様書としては PSGI よりも厳密に記述されています。

歴史

[1] PSGI 計画についてのおしらせ。for Japanese Perl Mongers - TokuLog 改めB日記 ( 版) <http://d.hatena.ne.jp/tokuhirom/20090904/1252091316>

[2] PSGI updates: Specs and more reference implementations - bulknews.typepad.com ( 版) <http://bulknews.typepad.com/blog/2009/09/psgi-updates-specs-and-more-reference-implementations.html>

[3] PSGI - Perl WSGI - bulknews.typepad.com ( 版) <http://bulknews.typepad.com/blog/2009/09/psgi-perl-wsgi.html>

[5] Feersum - search.cpan.org ( ( 版)) <http://search.cpan.org/dist/Feersum/lib/Feersum.pm#PSGI_extensions>

[22] plack/psgi-specs: PSGI (Perl WSGI) specifications () <https://github.com/plack/psgi-specs>

[24] Plack/Lint.pm at master · plack/Plack () <https://github.com/plack/Plack/blob/master/lib/Plack/Middleware/Lint.pm>

[27] psgi-specs/FAQ.pod at master · plack/psgi-specs () <https://github.com/plack/psgi-specs/blob/master/PSGI/FAQ.pod>