2

给定以下处理程序(直接来自 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)并获取标题和正文。理想情况下,我会做一些神奇的事情,#(1)并以某种方式强制$r存储响应(然后在 中检索它#(2))。

4

1 回答 1

4

您可以将您的应用程序包装在一个中间件中,使 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 处理程序代码之外使用它来做事。

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

于 2020-05-15T12:07:00.743 回答