<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <dfn>PSGI</dfn> は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> における <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPサーバー</anchor>と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webアプリケーション</anchor>との<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターフェイス<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">API</title></anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様</anchor>です。
<time>2009年<attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">year:2009</attrvalue></time>に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Tatsuhiko Miyagawa</anchor> らにより制定、実装されました。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WSGI</anchor> に強い影響を受けており、これを <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> に移植したものとなっています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> 現在では多くの <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPサーバー</anchor>や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webアプリケーション</anchor>が対応しています。</p><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> <cite xml:lang="en">psgi-specs/PSGI.pod at master · plack/psgi-specs</cite> (<time>2017-06-07 13:46:32 +09:00</time>) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/plack/psgi-specs/blob/master/PSGI.pod">https://github.com/plack/psgi-specs/blob/master/PSGI.pod</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> <cite xml:lang="en">psgi-specs/Extensions.pod at master · plack/psgi-specs</cite> (<time>2017-06-07 14:16:46 +09:00</time>) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/plack/psgi-specs/blob/master/PSGI/Extensions.pod">https://github.com/plack/psgi-specs/blob/master/PSGI/Extensions.pod</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <cite xml:lang="en">PSGI file evaluation convention · plack/psgi-specs Wiki</cite> (<time>2017-06-07 14:10:19 +09:00</time>) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/plack/psgi-specs/wiki/PSGI-file-evaluation-convention">https://github.com/plack/psgi-specs/wiki/PSGI-file-evaluation-convention</anchor-external></li></ul></refs></section><section><h1>プロトコル</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <figure class="short list"><ul><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGIアプリケーション</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メタ変数</anchor></li><li><code>psgix</code></li><li><cite>manakai PSGI extensions</cite></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ミドルウェア</anchor></li></ul></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>環境</anchor><rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">environment</rt></rubyb>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メタ変数</anchor>の流れを汲む<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ハッシュ参照</anchor>で、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPサーバー</anchor>から <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webアプリケーション</anchor>への伝達に使われます。</p><section><h1>限界</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>の責務が明確に定められていません。例えば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー値</anchor>に不適切な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">改行</anchor>が含まれると <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>として正しく解釈できなくなり、
ときに<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セキュリティー</anchor>の問題を引き起こすことがありますが、
これをどちらが保証するべきなのか、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>だとしたらどのように処理するべきなのか
(黙って訂正するべきなのか、何らかの方法でエラーとするべきなのか)
がはっきりしていません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> の機能のうち、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由句</anchor>には対応していません。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI</anchor> その他の既存の手法に対する明白な欠点です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> を扱うことができません。いくつかの実装は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ad hoc</anchor> 
な対応をしていますが、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">標準化</anchor>されていない (可搬性がない) だけでなく、
技術的に美しくない強引な方法を採っています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> <code>CONNECT</code> を扱うことができません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">server push</anchor> を扱うことができません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>の受信中に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント</anchor>との<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">接続<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">HTTP接続</title></anchor>が切断された場合や、
長い処理の途中で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">再起動</anchor>されようとしている時など、
中断した方が良いかもしれない場合にその旨を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>に伝達する手段がありません。</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <cite xml:lang="en">debug-ito/Plack-App-WebSocket</cite>
(<time>2015-04-17 15:12:33 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/debug-ito/Plack-App-WebSocket">https://github.com/debug-ito/Plack-App-WebSocket</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <cite>PSGIアプリでWebSocketを使う場合、responderはどうすべきか? - DebugIto’s diary</cite>
(<time>2015-04-17 15:14:38 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://d.hatena.ne.jp/debug-ito/20131110/1384067449">http://d.hatena.ne.jp/debug-ito/20131110/1384067449</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> <cite xml:lang="en">motemen/Plack-Middleware-WebSocket: WebSocket handshake helper middleware</cite> (<time>2017-02-18 14:12:52 +09:00</time>) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/motemen/Plack-Middleware-WebSocket">https://github.com/motemen/Plack-Middleware-WebSocket</anchor-external></li></ul></refs></section></section><section><h1><code>.psgi</code> ファイル</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGIアプリケーション</anchor>を返す <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perlスクリプト</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">拡張子</anchor>が <code>.psgi</code> 
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル</anchor> <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;25</anchor-internal></src> とすることがよくあるようです。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> を実装した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>は、
指定された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル</anchor>を <code>do<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">do (Perl)</title></code> などによって読み込み、
得られた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">コード参照</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">PSGIアプリケーション</title></anchor>として実行することが期待されています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGIスクリプト</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">拡張子</anchor> <code>.cgi</code> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル</anchor>とする<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">慣習</anchor>に倣ったもののようです。</p></section><section><h1>実装</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="28" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[28]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> の開発者らによる <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Plack</anchor> が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本</anchor>では広く用いられています。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Starlet</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Twiggy</anchor> のような主要な <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> 対応<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webサーバー</anchor>や、
各種 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WAF</anchor> が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Plack</anchor> を利用しており、一般の開発者が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Plack</anchor>
を混同する元凶となっています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="30" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[30]</anchor-end> 実際には <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Plack</anchor> を使わない <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> もいくつか存在し、使われています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="31" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[31]</anchor-end> ただし<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ミドルウェア</anchor>は、それ自体は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> で規定された概念ですが、実装上は
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Plack</anchor> を使い <code>Plack::Middleware</code> という名前を翳したものが多いです。
それらが <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Plack</anchor> 以外の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> の実装と現実的に共存できるのかは不明瞭です。</p></section><section><h1>関連</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="29" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[29]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl5</anchor> とは似て非なる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">プログラミング言語</title></anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl6</anchor> 向けには、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">P6W</anchor> という似て非なる <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> があります。当初は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">P6SGI</anchor>
と呼ばれ、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> の影響を強く受けていました。現在も PSGI Protocol 
という動作モードが <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> の一部を構成していますが、類似性は薄まっています。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> が扱えない <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> への対応や、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/2</anchor> の扱いの規定もあります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>としては <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PSGI</anchor> よりも厳密に記述されています。</p></section><section><h1>歴史</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <cite>PSGI 計画についてのおしらせ。for Japanese Perl Mongers - TokuLog 改めB日記</cite>
(<time>2009-09-08 09:30:30 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://d.hatena.ne.jp/tokuhirom/20090904/1252091316">http://d.hatena.ne.jp/tokuhirom/20090904/1252091316</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite>PSGI updates: Specs and more reference implementations - bulknews.typepad.com</cite>
(<time>2009-09-08 09:40:48 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://bulknews.typepad.com/blog/2009/09/psgi-updates-specs-and-more-reference-implementations.html">http://bulknews.typepad.com/blog/2009/09/psgi-updates-specs-and-more-reference-implementations.html</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <cite>PSGI - Perl WSGI - bulknews.typepad.com</cite>
(<time>2009-09-08 09:44:48 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://bulknews.typepad.com/blog/2009/09/psgi-perl-wsgi.html">http://bulknews.typepad.com/blog/2009/09/psgi-perl-wsgi.html</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <cite>Feersum - search.cpan.org</cite>
( (<time>2014-10-21 03:49:05 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://search.cpan.org/dist/Feersum/lib/Feersum.pm#PSGI_extensions">http://search.cpan.org/dist/Feersum/lib/Feersum.pm#PSGI_extensions</anchor-external></p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <cite>PSGI - search.cpan.org</cite>
(<time>2012-02-16 22:39:56 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://search.cpan.org/dist/PSGI/PSGI.pod">http://search.cpan.org/dist/PSGI/PSGI.pod</anchor-external></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> <cite xml:lang="en">plack/psgi-specs: PSGI (Perl WSGI) specifications</cite>
(<time>2017-06-07 13:46:04 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/plack/psgi-specs">https://github.com/plack/psgi-specs</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> <cite xml:lang="en">Plack/Lint.pm at master · plack/Plack</cite>
(<time>2017-06-07 14:04:52 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/plack/Plack/blob/master/lib/Plack/Middleware/Lint.pm">https://github.com/plack/Plack/blob/master/lib/Plack/Middleware/Lint.pm</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="27" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[27]</anchor-end> <cite xml:lang="en">psgi-specs/FAQ.pod at master · plack/psgi-specs</cite>
(<time>2017-06-07 14:19:33 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/plack/psgi-specs/blob/master/PSGI/FAQ.pod">https://github.com/plack/psgi-specs/blob/master/PSGI/FAQ.pod</anchor-external></p></section></body></html>