0

一切都很好,直到您发布值并获得:

[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;
}

是什么导致了这个问题?

4

1 回答 1

0

这意味着您的 CGI::PSGI 在 Plack::Request (由 Plack::Middleware::Debug::Parameters 使用)之前读取 STDIN。

要在您的应用程序中解决此问题,您必须调用:

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'} 替换STDINStream::Buffered. 所以 CGI$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;
}
于 2015-08-28T11:30:50.747 回答