Почему второй запрос не заканчивает вывод?

Браузер ожидает каких-то данных с сервера, и логирование выполняется только после перезагрузки сервера. Также я вижу, что дети могут разветвляться.

$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/, но без понятия.


person Eugen Konkov    schedule 22.05.2015    source источник


Ответы (2)


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

person Eugen Konkov    schedule 23.05.2015

Ваш обработчик не возвращает правильное значение. Кроме того, я не уверен, почему вы считаете, что попытка обработать запрос во второй раз, если первая приводит к ошибке, является хорошей идеей, поэтому я прокомментировал это.

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;
}
person Dondi Michael Stroma    schedule 31.05.2015
comment
На самом деле я возвращаю результат в свой исходный код. Я делаю второй запрос, потому что хочу выполнить какое-то дополнительное действие. Теперь я сохраняю данные в pnotes и делаю internal_redirect вместо handle_request - person Eugen Konkov; 01.06.2015