Спецификация PSGI определяет HTTP-ответ как состоящий из трех частей, третья из которых может быть либо ссылкой на массив, либо дескриптором файла.Файловый дескриптор может быть:
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
на дескрипторе, чтобы он не попадал в исключение?
И добавить еще одно:
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
Обновление:
Как указано в его ответе, будет работать следующее (по крайней мере, 5.10.1 в Cygwin):
plackup -p 9999 -MData::Dumper -MIO::String -e \
'sub { return [200, [], IO::String->new(\Dumper shift) ] }'
Но ясно, что где-то есть проблема, которую можно увидеть из неудачных примеров, и о ней сообщат, как только я решу, что это на самом деле.