Почему HTML::Mason::PSGIHandler не работает с «Plack::Middleware::Debug::Parameters»?

Все в порядке, пока вы не опубликуете значения и не получите:

[uwsgi-perl error] Bad Content-Length: maybe client disconnect? (45 bytes remaining) at /home/user/perl5/lib/perl5/Plack/Middleware/Debug/Parameters.pm line 20.

Скелет приложения:

use Modern::Perl;
use HTML::Mason::PSGIHandler;

$app = sub {
    my $env = shift;

    $h = HTML::Mason::PSGIHandler->new(%mason_config);
    $h->handle_psgi($env);
}

use Plack::Builder;
my $b = builder {
    enable "Debug", panels => ['Parameters'];
    $app;
}

Что вызывает эту проблему?


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


Ответы (1)


Это означает, что ваш CGI::PSGI считывает STDIN перед Plack::Request (который используется Plack::Middleware::Debug::Parameters).

Чтобы обойти это в своем приложении, вы должны вызвать:

Plack::Request->new($env)->body_parameters;

use Modern::Perl;
use HTML::Mason::PSGIHandler;

$app = sub {
    my $env = shift;

    $h = HTML::Mason::PSGIHandler->new(%mason_config);

    Plack::Request->new($env)->body_parameters; #<<<WORKAROUND
    $h->handle_psgi($env);
}

use Plack::Builder;
my $b = builder {
    enable "Debug", panels => ['Parameters'];
    $app;
}

Что происходит?

Plack::Request прочитает тело и поместит его обратно в $env->{'psgi.input'}, заменив STDIN на Stream::Buffered. Итак, CGI's$self->read_from_client(...) не замечает изменений:

См. PSGI::CGI.

sub read_from_client {

    my($self, $buff, $len, $offset) = @_;
    my $read = $self->{psgi_env}{'psgi.input'}->read($$buff, $len, $offset);

    return $read;
}
person Eugen Konkov    schedule 28.08.2015