为什么第二个请求没有完成输出?
Why second request do not finish output?
浏览器等待来自服务器的一些数据,只有在服务器重启后才会进行日志记录。我也看到可能孩子是分叉的。
$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/ 但没有任何线索。
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
您的处理程序没有 return 正确的值。另外,我不确定为什么您认为如果第一次请求导致错误则尝试第二次处理请求是个好主意,所以我已经将其注释掉了。
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;
}
浏览器等待来自服务器的一些数据,只有在服务器重启后才会进行日志记录。我也看到可能孩子是分叉的。
$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/ 但没有任何线索。
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
您的处理程序没有 return 正确的值。另外,我不确定为什么您认为如果第一次请求导致错误则尝试第二次处理请求是个好主意,所以我已经将其注释掉了。
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;
}