如何拦截 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 处理程序代码之外使用它。

请注意,我没有 运行 此代码,但我很确定它应该可以工作。