为什么第二个请求没有完成输出?

时间:2015-05-22 17:13:35

标签: apache mod-perl2 mason

浏览器等待来自服务器的某些数据,并且仅在服务器重新启动后才进行日志记录。我也看到孩子们分叉了。

$ah{ $r->hostname } ||=  HTML::Mason::ApacheHandler->new ( .. )

sub handle{
    eval{ $ah{ $r->hostname }->handle_request($r); };
    if( $@ ) {
    $r->filename( $r->document_root . '/errors/500.html' );
    $ah{ $r->hostname }->handle_request($r); };
    $r->log_error( 'ERROR' );
    }
}

我做错了所以他们没有完成?

UPD 我只发现了一个关于同一问题的注释:http://sourceforge.net/p/mason/mailman/message/14999444/但没有任何线索。

2 个答案:

答案 0 :(得分:1)

http://foertsch.name/ModPerl-Tricks/custom-content_type-with-custom_response.shtml

因此,我们不是将错误文本直接传递给custom_response,而是将其存储在pnotes中,并将其他未使用的URI设置为/ - / error,如custom_response:

sub handler {
  my ($r)=@_;
  @{$r->pnotes}{qw/etext ect/}=("sorry, no access\n", 'text/plain; charset=my-characters');
  $r->custom_response( 403, "/-/error" );
  return 403;
}

现在,我们需要配置/ - / error来运行Perl处理程序:

<Location /-/error>
  SetHandler modperl
  PerlResponseHandler My::Error
</Location>

当然,我们需要处理函数,My :: Error :: handler:

sub handler {
  my ($r)=@_;
  return Apache2::Const::NOT_FOUND unless $r->prev;
  $r->content_type($r->prev->pnotes->{ect});
  $r->print($r->prev->pnotes->{etext});
  return Apache2::Const::OK;
}

这个解决方案似乎有效,但我还不知道主要问题的答案:为什么请求没有完成?

<强> UPD

这似乎是mod_perl2的一个错误 https://bz.apache.org/bugzilla/show_bug.cgi?id=57976

答案 1 :(得分:0)

您的处理程序没有返回正确的值。此外,我不确定为什么你认为如果第一个请求导致错误第二次尝试处理请求是个好主意,所以我已经评论过了。

sub handle{
    my $result = eval{ $ah{ $r->hostname }->handle_request($r); };
    if( $@ ) {
      $r->filename( $r->document_root . '/errors/500.html' );
      # $ah{ $r->hostname }->handle_request($r); };
      $r->log_error( 'ERROR' );
    }
    return $result;
}