PSGI仕様では、HTTP応答を3つの部分で構成されていると定義しており、そのうちの3番目は配列参照またはファイルハンドルのいずれかです。ファイルハンドルは次のとおりです。
IO::Handleのようなオブジェクトまたは組み込みのファイルハンドル。
そして、仕様は次のように続けています。
サーバーは、filenoとScalar :: Util :: reftypeを使用して、本体が実際のファイルハンドルであるかどうかを確認できます。ファイル記述子を持つ実際のファイルハンドルである場合は、sendfile(2)などの手法を使用してファイル配信を最適化できます。
plackup
(Plackバージョン0.9978)を使用してコマンドラインの例をまとめましたが、本文が実際のファイルハンドルであるかどうかを確認すると、致命的なエラーが発生するようです。
Can't locate object method "FILENO" via package "IO::Scalar" at /usr/lib/perl5/5.10/i686-cygwin/IO/Handle.pm line 390
コマンドラインの例は次のとおりです。
plackup -MData::Dumper -MIO::Scalar -e \
'sub { $env=shift; return [200, [], IO::Scalar->new(\Dumper $env) ] }'
もちろん、ファイルハンドルを使用することはできませんでした。
plackup --port 9999 -MData::Dumper -e \
'sub { $env=shift; return [200, [], [Dumper $env] ] }'
しかし、私は何が機能し、何が機能しないかに興味があります。FILENO
では、例外が発生しないように、ハンドルを呼び出すときにPlackはもっと注意を払うべきではありませんか?
そしてもう1つ追加するには:
plackup --port 9999 -MData::Dumper -e \
'sub{$env=shift; $s=Dumper $env; open $fh,q(<),\$s or die; return [200,[],$fh ]}'
ファイルハンドルがそのように認識されていないようです。エラーメッセージは次のとおりです。
body should be an array ref or filehandle at /usr/lib/perl5/site_perl/5.10/Plack/Middleware/StackTrace.pm line 35
アップデート:
ysthが彼の回答で述べたように、以下は機能します(少なくともCygwinの5.10.1では):
plackup -p 9999 -MData::Dumper -MIO::String -e \
'sub { return [200, [], IO::String->new(\Dumper shift) ] }'
しかし、明らかに、失敗した例からわかるようにどこかに問題があり、それが実際に何であるかを決心したら報告されます。