如何拦截 Plack/Apache 中的回复
How to intercept reply in Plack/Apache
给定以下处理程序(直接来自
https://metacpan.org/pod/Plack::Handler::Apache2)
package My::ModPerl::Handler;
use Plack::Handler::Apache2;
sub get_app {
# magic!
}
sub handler {
my $r = shift; # Apache2::RequestRec
my $app = get_app(); # CODE
#-- #(1)
Plack::Handler::Apache2->call_app($r, $app);
#-- #(2)
}
并且 app
是一个黑盒子,有没有办法以某种方式检索
生成的完整响应?我想在
标有 #(2)
的行并获得 headers 和 body。理想情况下,
我会在行 #(1)
中做一些神奇的事情并以某种方式强制 $r
存储响应(然后在 #(2)
中检索它)。
您可以将您的应用包装在一个中间件中,使 PSGI 响应在您的处理程序代码中可用。
package My::ModPerl::Handler;
use Plack::Handler::Apache2;
sub get_app {
# magic!
}
sub handler {
my $r = shift; # Apache2::RequestRec
my $app = get_app(); # CODE
my $res; # this will hold the response
Plack::Handler::Apache2->call_app(
$r,
sub {
my $env = shift;
$res = $app->($env); # closes over outside variable
return $res;
}
);
# $res == [ $status, $headers, $body ]
}
此代码关闭 $res
并从应用程序内部(或者更确切地说是它周围的额外层)分配响应。然后,您可以在自己的代码中的 Apache 处理程序代码之外使用它。
请注意,我没有 运行 此代码,但我很确定它应该可以工作。
给定以下处理程序(直接来自 https://metacpan.org/pod/Plack::Handler::Apache2)
package My::ModPerl::Handler;
use Plack::Handler::Apache2;
sub get_app {
# magic!
}
sub handler {
my $r = shift; # Apache2::RequestRec
my $app = get_app(); # CODE
#-- #(1)
Plack::Handler::Apache2->call_app($r, $app);
#-- #(2)
}
并且 app
是一个黑盒子,有没有办法以某种方式检索
生成的完整响应?我想在
标有 #(2)
的行并获得 headers 和 body。理想情况下,
我会在行 #(1)
中做一些神奇的事情并以某种方式强制 $r
存储响应(然后在 #(2)
中检索它)。
您可以将您的应用包装在一个中间件中,使 PSGI 响应在您的处理程序代码中可用。
package My::ModPerl::Handler;
use Plack::Handler::Apache2;
sub get_app {
# magic!
}
sub handler {
my $r = shift; # Apache2::RequestRec
my $app = get_app(); # CODE
my $res; # this will hold the response
Plack::Handler::Apache2->call_app(
$r,
sub {
my $env = shift;
$res = $app->($env); # closes over outside variable
return $res;
}
);
# $res == [ $status, $headers, $body ]
}
此代码关闭 $res
并从应用程序内部(或者更确切地说是它周围的额外层)分配响应。然后,您可以在自己的代码中的 Apache 处理程序代码之外使用它。
请注意,我没有 运行 此代码,但我很确定它应该可以工作。