POD2-RU-PSGI
view release on metacpan or search on metacpan
lib/POD2/RU/PSGI.pod view on Meta::CPAN
ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑÑаеÑÑÑ Ð¿ÑÑÑм конвеÑÑаÑии имени Ð¿Ð¾Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° HTTP в
веÑÑ
ний ÑегиÑÑÑ, замеÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
деÑиÑов C<-> на подÑÑÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ C<_> и
подÑÑановки пÑиÑÑавки C<HTTP>, как в L<RFC 3875|http://www.ietf.org/rfc/rfc3875>.
ÐÑли еÑÑÑ Ð½ÐµÑколÑко ÑÑÑок заголовка, оÑпÑавленнÑÑ
Ñ Ð¾Ð´Ð½Ð¸Ð¼ клÑÑом (именем
пеÑеменной), ÑеÑвеÑÑ ÑледÑÐµÑ ÑаÑÑмаÑÑиваÑÑ Ð¸Ñ
Ñак, как бÑдÑо они бÑли поÑÐ»Ð°Ð½Ñ Ð²
одной ÑÑÑоке и обÑединÑÑÑ Ð¸Ñ
пÑи помоÑи C<, >, как опиÑано в
L<RFC 2616|http://www.ietf.org/rfc/rfc2616>.
=back
Рдобавление к клÑÑам, опиÑаннÑм вÑÑе, окÑÑжение PSGI B<ÐÐÐÐÐÐ> Ñакже вклÑÑаÑÑ
ÑледÑÑÑие ÑпеÑиÑиÑнÑе Ð´Ð»Ñ PSGI клÑÑи:
=over 4
=item *
C<psgi.version>: СÑÑлка на маÑÑив [1,1], пÑедÑÑавлÑÑÑий иÑполÑзÑемÑÑ Ð²ÐµÑÑиÑ
PSGI. ÐеÑвое ÑиÑло - ÑÑаÑÑий Ð½Ð¾Ð¼ÐµÑ Ð²ÐµÑÑии, вÑоÑое - младÑий Ð½Ð¾Ð¼ÐµÑ Ð²ÐµÑÑии.
=item *
C<psgi.url_scheme>: СÑÑока C<http> или C<https>, завиÑÑÑÐ°Ñ Ð¾Ñ URL запÑоÑа.
=item *
C<psgi.input>: вÑ
одной поÑок. ÐодÑобноÑÑи Ñм. ниже.
=item *
C<psgi.errors>: поÑок оÑибок. ÐодÑобноÑÑи Ñм. ниже.
=item *
C<psgi.multithread>: ÐÑо бÑлево знаÑение, коÑоÑое B<ÐÐÐÐÐÐ> бÑÑÑ true, еÑли
пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно вÑзвано дÑÑгой ниÑÑÑ Ñого же пÑоÑеÑÑа,
инаÑе false.
=item *
C<psgi.multiprocess>: ÐÑо бÑлево знаÑение, коÑоÑое B<ÐÐÐÐÐÐ> бÑÑÑ true, еÑли
ÑквиваленÑнÑй обÑÐµÐºÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно вÑзван дÑÑгим
пÑоÑеÑÑом, инаÑе false.
=item *
C<psgi.run_once>: ÐÑлево знаÑение, ÑодеÑжаÑее true, еÑли ÑеÑÐ²ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ (но не
гаÑанÑиÑÑеÑ!), ÑÑо пÑиложение бÑÐ´ÐµÑ Ð²Ñзвано ÑолÑко в ÑÑÐ¾Ñ ÐµÐ´Ð¸Ð½ÑÑвеннÑй Ñаз за
вÑÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ ÑодеÑжаÑего его пÑоÑеÑÑа. ÐбÑÑно ÑÑо бÑÐ²Ð°ÐµÑ Ð²ÐµÑно ÑолÑко длÑ
ÑеÑвеÑа, оÑнованного на CGI (или на ÑÑм-Ñо поÑ
ожем).
=item *
C<psgi.nonblocking>: ÐÑлево знаÑение, ÑодеÑжаÑее true, еÑли ÑеÑÐ²ÐµÑ Ð²ÑзÑваеÑ
пÑиложение в неблокиÑÑÑÑем ÑобÑÑийном Ñикле.
=item *
C<psgi.streaming>: ÐÑлево знаÑение, Ñавное true, еÑли ÑеÑÐ²ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ
оÑложенного оÑвеÑа в ÑÑиле callback и поÑокового пиÑÑÑего обÑекÑа.
=back
СеÑÐ²ÐµÑ Ð¸Ð»Ð¸ пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑоÑ
ÑанÑÑÑ Ñвои даннÑе в пеÑеменнÑÑ
окÑÑжениÑ. ÐÑи пеÑеменнÑе B<ÐÐÐÐÐЫ> ÑодеÑжаÑÑ Ð¿Ð¾ менÑÑей меÑе Ð¾Ð´Ð½Ñ ÑоÑкÑ, и иÑ
B<СÐÐÐУÐТ> назÑваÑÑ, наÑÐ¸Ð½Ð°Ñ Ñ ÑникалÑной пÑиÑÑавки.
ÐÑиÑÑавка C<psgi.> заÑезеÑвиÑована Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¾Ñновной ÑпеÑиÑикаÑией
PSGI, а пÑиÑÑавка C<psgix.> заÑезеÑвиÑована Ð´Ð»Ñ Ð¾ÑиÑиалÑно одобÑеннÑÑ
ÑаÑÑиÑений. ÐÑи пÑиÑÑавки B<ÐÐ ÐÐÐÐÐЫ> иÑполÑзоваÑÑÑÑ Ð´ÑÑгими ÑеÑвеÑами или
пÑиложением. См. ÑпиÑок оÑиÑиалÑно одобÑеннÑÑ
ÑаÑÑиÑений в
L<psgi-extensions|PSGI::Extentions>.
ÐкÑÑжение B<ÐÐ ÐÐÐÐÐÐ> ÑодеÑжаÑÑ ÐºÐ»ÑÑи Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ C<HTTP_CONTENT_TYPE> или
C<HTTP_CONTENT_LENGTH>.
Ðдна из пеÑеменнÑÑ
C<SCRIPT_NAME> или C<PATH_INFO> B<ÐÐÐÐÐÐ> бÑÑÑ ÑÑÑановлена.
Ðогда C<REQUEST_URI> - ÑÑо C</>, пеÑеменной C<PATH_INFO> ÑледÑÐµÑ Ð±ÑÑÑ Ñавной
C</>, а пеÑеменной C<SCRIPT_NAME> ÑледÑÐµÑ Ð±ÑÑÑ Ð¿ÑÑÑой. ÐеÑеменнаÑ
C<SCRIPT_NAME> B<ÐÐ ÐÐÐÐÐÐ> бÑÑÑ Ñавной C</>, но B<ÐÐÐÐТ> бÑÑÑ Ð¿ÑÑÑой.
=head3 ÐÑ
одной ÐоÑок
ÐÑ
одной поÑок в C<psgi.input> - ÑÑо L<IO::Handle>-подобнÑй обÑекÑ, коÑоÑÑй
оÑдаÑÑ Ð¿Ð¾Ñок необÑабоÑаннÑÑ
даннÑÑ
HTTP POST или PUT запÑоÑов. ÐÑли ÑÑо
деÑкÑипÑÐ¾Ñ Ñайла, он B<ÐÐÐÐÐÐ> бÑÑÑ Ð¾ÑкÑÑÑ Ð² бинаÑном Ñежиме. ÐÑ
одной поÑок
B<ÐÐÐÐÐÐ> оÑвеÑаÑÑ Ð½Ð° запÑÐ¾Ñ C<read> и B<ÐÐÐÐТ> ÑеализовÑваÑÑ C<seek>.
ÐÑÑÑоеннÑе в Perl ÑайловÑе деÑкÑипÑоÑÑ Ð¸Ð»Ð¸ оÑнованнÑе на L<IO::Handle> обÑекÑÑ
Ð´Ð¾Ð»Ð¶Ð½Ñ ÑабоÑаÑÑ "как еÑÑÑ" внÑÑÑи PSGI ÑеÑвеÑа. РазÑабоÑÑикам пÑиложений B<ÐÐ
СÐÐÐУÐТ> конÑÑолиÑоваÑÑ Ñип или клаÑÑ Ð¿Ð¾Ñока. ÐмеÑÑо ÑÑого им B<СÐÐÐУÐТ>
пÑоÑÑо вÑзÑваÑÑ Ð¼ÐµÑод C<read> обÑекÑа.
РазÑабоÑÑикам пÑиложений B<ÐРСÐÐÐУÐТ> иÑполÑзоваÑÑ Ð²ÑÑÑоеннÑÑ ÑÑнкÑÐ¸Ñ Perl
C<read> или иÑеÑаÑÐ¾Ñ (C<< <$fh> >>) Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð¸Ð· вÑ
одного поÑока. ÐмеÑÑо
ÑÑого ÑазÑабоÑÑикам пÑиложений ÑледÑÐµÑ Ð²ÑзÑваÑÑ C<read> как меÑод
(C<< $fh->read >>) Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑÑиной ÑипизаÑии.
РазÑабоÑÑикам ÑÑеймвоÑков, еÑли они знаÑÑ, ÑÑо вÑ
одной поÑок бÑÐ´ÐµÑ Ð¸ÑполÑзован
Ñо вÑÑÑоенной ÑÑнкÑией read() в лÑбом апÑÑÑим-коде, коÑоÑÑй они не ÑмогÑÑ
ÑÑогаÑÑ, B<СÐÐÐУÐТ> иÑполÑзоваÑÑ PerlIO или tied handle Ð´Ð»Ñ Ð¾Ð±ÑабоÑки ÑÑой
пÑоблемÑ.
ÐжидаеÑÑÑ, ÑÑо обÑÐµÐºÑ Ð²Ñ
одного поÑока обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¼ÐµÑод C<read>:
=over 4
=item read
$input->read($buf, $len [, $offset ]);
ÐозвÑаÑÐ°ÐµÑ ÑиÑло дейÑÑвиÑелÑно пÑоÑиÑаннÑÑ
Ñимволов, 0 в конÑе Ñайла, или
undef пÑи оÑибке.
=back
Ðн Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑеализовÑваÑÑ Ð¾Ð¿ÑионалÑнÑй меÑод C<seek>. ÐÑли
пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑÑÐ¶ÐµÐ½Ð¸Ñ C<psgix.input.buffered> Ñавна true, он B<ÐÐÐÐÐÐ>
lib/POD2/RU/PSGI.pod view on Meta::CPAN
ÑодеÑжаÑÑ "ÑиÑокиÑ
" Ñимволов (> 255).
=over 4
=item *
ÐÑли Ñело оÑвеÑа - ÑÑÑлка на маÑÑив, ожидаеÑÑÑ, ÑÑо оно ÑодеÑÐ¶Ð¸Ñ Ð¼Ð°ÑÑив ÑÑÑок,
из коÑоÑÑÑ
ÑоÑÑÐ¾Ð¸Ñ Ñамо Ñело.
my $body = [ "Hello\n", "World\n" ];
ÐбÑаÑиÑе внимание, ÑÑо ÑлеменÑÑ Ð² маÑÑиве B<ÐÐÐÐЯÐÐТÐÐЬÐÐ> Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÐºÐ°Ð½ÑиваÑÑÑÑ
пеÑеводом ÑÑÑоки. СеÑвеÑÑ B<СÐÐÐУÐТ> оÑпÑавлÑÑÑ ÐºÐ°Ð¶Ð´Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ "как еÑÑÑ"
клиенÑÑ, и B<ÐРСÐÐÐУÐТ> забоÑиÑÑÑÑ Ð¾ Ñом, оканÑиваÑÑÑÑ Ð»Ð¸ ÑÑÑоки пеÑеводом
ÑÑÑоки, или неÑ.
СÑÑлка на маÑÑив Ñ ÐµÐ´Ð¸Ð½ÑÑвеннÑм знаÑением валидна. Так, C<[ $html ]> -
валидное Ñело оÑвеÑа.
=item *
Тело оÑвеÑа Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¼ÐµÑÑо ÑÑого бÑÑÑ Ð´ÐµÑкÑипÑоÑом - или вÑÑÑоеннÑм ÑайловÑм
деÑкÑипÑоÑом Perl, или L<IO::Handle>-подобнÑм обÑекÑом.
open my $body, "</path/to/file";
open my $body, "<:via(SomePerlIO)", ...;
my $body = IO::File->new("/path/to/file");
# mock class that implements getline() and close()
my $body = SomeClass->new();
СеÑвеÑам B<ÐРСÐÐÐУÐТ> пÑовеÑÑÑÑ Ñип или клаÑÑ Ñела оÑвеÑа. ÐмеÑÑо ÑÑого им
ÑледÑÐµÑ Ð¿ÑоÑÑо вÑзÑваÑÑ C<getline> Ð´Ð»Ñ Ð¿ÐµÑебоÑа ÑÑÑок Ñела, и вÑзваÑÑ C<close>
по завеÑÑениÑ.
СеÑвеÑÑ B<ÐÐÐУТ> пÑовеÑÑÑÑ, ÑвлÑеÑÑÑ Ð»Ð¸ Ñело ÑеалÑнÑм ÑайловÑм деÑкÑипÑоÑом,
иÑполÑзÑÑ C<fileno> и C<Scalar::Util::reftype>. ÐÑли Ñело - ÑеалÑнÑй
деÑкÑипÑÐ¾Ñ Ñайла, ÑеÑÐ²ÐµÑ B<ÐÐÐÐТ> опÑимизиÑоваÑÑ Ð²Ñполнение, иÑполÑзÑÑ Ð¼ÐµÑодÑ
вÑоде I<sendfile(2)>.
ÐбÑÐµÐºÑ Ñела Ñакже B<ÐÐÐÐТ> имеÑÑ Ð¼ÐµÑод C<path>. ÐжидаеÑÑÑ, ÑÑо ÑÑÐ¾Ñ Ð¼ÐµÑод
возвÑаÑÐ¸Ñ Ð¿ÑÑÑ Ðº ÑайлÑ, доÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ. ÐÑо позволÑÐµÑ ÑеÑвеÑÑ Ð¸ÑполÑзоваÑÑ
даннÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð²Ð¼ÐµÑÑо номеÑа Ñайлового деÑкÑипÑоÑа Ð´Ð»Ñ Ð¾ÑдаÑи Ñайла.
СеÑвеÑам B<СÐÐÐУÐТ> ÑÑÑанавливаÑÑ ÑпеÑиалÑнÑÑ Ð¿ÐµÑеменнÑÑ C<$/> Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑениÑ
ÑазмеÑа бÑÑеÑа пÑи ÑÑении ÑодеÑжимого из C<$body> пÑи помоÑи меÑода
C<getline>. ÐÑо делаеÑÑÑ Ð¿ÑÑÑм пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ C<$/> ÑÑÑлки на Ñелое ÑиÑло (C<$/
= \8192>).
ÐÑли ÑайловÑй деÑкÑипÑÐ¾Ñ Ñела оÑвеÑа - вÑÑÑоеннÑй ÑайловÑй деÑкÑипÑÐ¾Ñ Perl или
обÑÐµÐºÑ L<IO::Handle>, они обÑаÑÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ на знаÑение. ÐоÑ
ожим обÑазом
обÑекÑ, пÑедоÑÑавлÑÑÑий аналогиÑнÑй API, B<ÐÐÐÐТ> Ñакже обÑаÑиÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ на
ÑÑÑ ÑпеÑиалÑнÑÑ Ð¿ÐµÑеменнÑÑ, но Ð¾Ñ Ð½ÐµÐ³Ð¾ не ÑÑебÑеÑÑÑ Ð´ÐµÐ»Ð°ÑÑ ÑÑо.
=back
=head2 ÐÑложеннÑй ÐÑÐ²ÐµÑ Ð¸ ÐоÑоковое Тело оÑвеÑа
The PSGI interface allows applications and servers to provide a
callback-style response instead of the three-element array
reference. This allows for a delayed response and a streaming body
(server push).
ÐнÑеÑÑÐµÐ¹Ñ PSGI позволÑÐµÑ Ð¿ÑиложениÑм и ÑеÑвеÑам пÑедоÑÑавлÑÑÑ Ð¾ÑÐ²ÐµÑ Ð² виде
вÑзÑваемой ÑÑнкÑии вмеÑÑо ÑÑÑлки на ÑÑÑÑ
ÑлеменÑнÑй маÑÑив. ÐÑо позволÑеÑ
возвÑаÑаÑÑ Ð¾ÑложеннÑе оÑвеÑÑ Ð¸ поÑоковое Ñело оÑвеÑа (server push).
PSGI ÑеÑвеÑам B<СÐÐÐУÐТ> ÑеализовÑваÑÑ ÑÑÐ¾Ñ Ð¸Ð½ÑеÑÑейÑ, и пеÑеменнаÑ
C<psgi.streaming> должна бÑÑÑ Ñавна true в ÑакиÑ
ÑеÑвеÑаÑ
.
ЧÑÐ¾Ð±Ñ ÑазÑеÑиÑÑ Ð¾ÑложеннÑй оÑвеÑ, пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ B<СÐÐÐУÐТ> возвÑаÑаÑÑ Ð²ÑзÑваемÑÑ
ÑÑнкÑÐ¸Ñ Ð² каÑеÑÑве оÑвеÑа. ÐÑиложение B<ÐÐÐÐТ> пÑовеÑÑÑÑ, ÑÑо пеÑеменнаÑ
C<psgi.streaming> Ñавна true, и возвÑаÑаÑÑÑÑ Ðº непоÑÑедÑÑÐ²ÐµÐ½Ð½Ð¾Ð¼Ñ Ð¾ÑвеÑÑ, еÑли
ÑÑо не Ñак.
This callback will be called with I<another> subroutine reference (referred to
as the I<responder> from now on) as its only argument. The I<responder>
should in turn be called with the standard three element array reference
response. This is best illustrated with an example:
ÐÑа вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана Ñо ÑÑÑлкой наI<дÑÑгÑÑ> ÑÑнкÑÐ¸Ñ (далее
назÑваемÑÑ I<оÑвеÑÑик>) в каÑеÑÑве единÑÑвенного аÑгÑменÑа. I<ÐÑвеÑÑик> должен
в ÑÐ²Ð¾Ñ Ð¾ÑеÑÐµÐ´Ñ Ð±ÑÑÑ Ð²Ñзван Ñо ÑÑандаÑÑнÑм оÑвеÑом в виде ÑÑÑлки на
ÑÑÑÑ
ÑлеменÑнÑй маÑÑив. ÐаилÑÑÑим обÑазом ÑÑо иллÑÑÑÑиÑÑеÑÑÑ ÑледÑÑÑим
пÑимеÑом:
my $app = sub {
my $env = shift;
# ÐÑкладÑÐ²Ð°ÐµÑ Ð¾ÑÐ²ÐµÑ Ð´Ð¾ ÑеÑ
поÑ, пока он не полÑÑÐ¸Ñ Ð¾ÑÐ²ÐµÑ Ð¾Ñ ÑеÑи
return sub {
my $responder = shift;
fetch_content_from_server(sub {
my $content = shift;
$responder->([ 200, $headers, [ $content ] ]);
});
};
};
ÐÑиложение B<ÐÐÐÐТ> опÑÑÑиÑÑ ÑÑеÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ (Ñело) пÑи вÑзове I<оÑвеÑÑика>.
ÐÑли Ñело пÑопÑÑено, I<оÑвеÑÑик> B<ÐÐÐÐÐÐ> возвÑаÑиÑÑ I<еÑÑ Ð¾Ð´Ð¸Ð½> обÑекÑ,
в коÑоÑом ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð¼ÐµÑÐ¾Ð´Ñ C<write> и C<close>. Снова пÑоиллÑÑÑÑиÑÑем ÑÑо
пÑимеÑом.
my $app = sub {
my $env = shift;
# immediately starts the response and stream the content
return sub {
my $responder = shift;
my $writer = $responder->(
[ 200, [ 'Content-Type', 'application/json' ]]);
wait_for_events(sub {
my $new_event = shift;
if ($new_event) {
$writer->write($new_event->as_json . "\n");
} else {
$writer->close;
}
});
};
};
ÐÑÐ¾Ñ Ð¾ÑложеннÑй оÑÐ²ÐµÑ Ð¸ поÑоковÑй API полезнÑ, еÑли Ð²Ñ Ñ
оÑиÑе ÑеализоваÑÑ
оÑнованнÑÑ Ð½Ð° неблокиÑÑÑÑем вводе/вÑводе оÑдаÑÑ Ð¿Ð¾Ñока ÑеÑвеÑом или ÑеÑ
нологиÑ
long-poll Comet push, но могÑÑ Ñакже бÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ ÑеализаÑии
небÑÑеÑизованной запиÑи в блокиÑÑÑÑем ÑеÑвеÑе.
=head2 Middleware
ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ I<middleware> беÑÑÑ Ð´ÑÑгое PSGI пÑиложение и запÑÑÐºÐ°ÐµÑ ÐµÐ³Ð¾. С ÑоÑки
зÑÐµÐ½Ð¸Ñ ÑеÑвеÑа ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ middleware - PSGI пÑиложение. С ÑоÑки зÑениÑ
пÑиложениÑ, запÑÑкаемого компоненÑом middleware, middleware - ÑÑо ÑеÑвеÑ. Ðак
пÑавило ÑÑо делаеÑÑÑ Ð´Ð»Ñ ÑеализаÑии некоего ÑпоÑоба пÑедваÑиÑелÑной обÑабоÑки
Ñ
еÑа PSGI окÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ поÑÑ-обÑабоÑки запÑоÑа.
ÐÐ¾Ñ Ð¿ÑоÑÑой пÑимеÑ, коÑоÑÑй добавлÑÐµÑ ÑпеÑиалÑнÑй HTTP заголовок
I<X-PSGI-Used> к лÑÐ±Ð¾Ð¼Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ PSGI.
# $app - пÑоÑÑое пÑиложение PSGI
my $app = sub {
my $env = shift;
return [ '200',
[ 'Content-Type' => 'text/plain' ],
[ "Hello World" ] ];
};
# $xheader - ÑаÑÑÑ middleware, коÑоÑÐ°Ñ Ð¾Ð±ÑÑнÑÑа вокÑÑг $app
my $xheader = sub {
my $env = shift;
my $res = $app->($env);
push @{$res->[1]}, 'X-PSGI-Used' => 1;
return $res;
};
Middleware B<ÐÐÐÐÐÐ> веÑÑи ÑÐµÐ±Ñ Ð² ÑоÑноÑÑи Ñак же, как пÑиложение PSGI Ñ ÑоÑки
зÑÐµÐ½Ð¸Ñ ÑеÑвеÑа. Middleware B<ÐÐÐÐТ> ÑеÑиÑÑ Ð½Ðµ поддеÑживаÑÑ Ð¿Ð¾ÑоковÑй
инÑеÑÑейÑ, обÑÑждавÑийÑÑ Ñанее, но ÐµÐ¼Ñ B<СÐÐÐУÐТ> пÑопÑÑкаÑÑ Ð±ÐµÑпÑепÑÑÑÑвенно
Ñе ÑÐ¸Ð¿Ñ Ð¾ÑвеÑов, коÑоÑÑе оно не понимаеÑ.
=head1 CHANGELOGS
1.1: 2010.02.xx
=over 4
=item *
Added optional PSGI keys as extensions: C<psgix.logger> and C<psgix.session>.
=item *
C<psgi.streaming> B<SHOULD> be implemented by PSGI servers, rather than B<MAY>.
=item *
PSGI keys C<psgi.run_once>, C<psgi.nonblocking> and C<psgi.streaming>
B<MUST> be set by PSGI servers.
=item *
Removed C<poll_cb> from writer methods.
=back
=head1 ACKNOWLEDGEMENTS
Some parts of this specification are adopted from the following specifications.
=over 4
=item *
PEP333 Python Web Server Gateway Interface L<http://www.python.org/dev/peps/pep-0333>
=item *
Rack L<http://rack.rubyforge.org/doc/SPEC.html>
=item *
JSGI Specification L<http://jackjs.org/jsgi-spec.html>
=back
I'd like to thank authors of these great documents.
=head1 AUTHOR
Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>
=head1 CONTRIBUTORS
The following people have contributed to the PSGI specification and
Plack implementation by commiting their code, sending patches,
reporting bugs, asking questions, suggesting useful advices,
nitpicking, chatting on IRC or commenting on my blog (in no particular
order):
Tokuhiro Matsuno
Kazuhiro Osawa
Yuval Kogman
Kazuho Oku
Alexis Sukrieh
Takatoshi Kitano
Stevan Little
Daisuke Murase
mala
Pedro Melo
Jesse Luehrs
John Beppu
Shawn M Moore
Mark Stosberg
Matt S Trout
Jesse Vincent
Chia-liang Kao
Dave Rolsky
( run in 1.233 second using v1.01-cache-2.11-cpan-39bf76dae61 )