[Catalyst] Configure psgi.input as optional?

Bill Moseley moseley at hank.org
Fri Jun 5 18:26:54 GMT 2015


Our app handles a lot of uploads, often quite large uploads.    As we know,
uploads (and any non-parsed body) gets written to temp files via HTTP::Body.

Now, Catalyst::Request also writes every body to a temp file (via
Stream::Buffered).   So, depending on the body size, can take up to twice
the space in temp files as the content length.

If we are not going to use psgi.input and just use Catalyst's
(HTTP::Body's) temp files could we make the creation of psgi.input optional?

I have a few other concerns about the current code.

prepare_body in Catalyst::Request does not check the return code when it
writes to the psgi.input file.   HTTP::Body also fails to check return
codes when it writes.   This means if the partition where temp files are
created fills then Catalyst request will ignore this and continue as if
there's no problem.   I trust the risk here is recognized.

I think the fix in Catalyst::Request is pretty simple by checking return

    # Check for definedness as you could read '0'
    while ( defined ( my $chunk = $self->read() ) ) {

        next unless $stream_buffer;
            || die sprintf "Failed to write %d bytes to psgi.input file:
$!", length( $chunk );

HTTP::Body needs similar changes.

See any problem with making the psgi.input file optional?   And any reason
not to throw an exception when writing to the temp file fails?

BTW -- Plack::Handler::Apache2 sets psgi.input to the Apache request object
$r -- it would be handy to preserve this object for later use.

Bill Moseley
moseley at hank.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.scsys.co.uk/pipermail/catalyst/attachments/20150605/d43abfbe/attachment.htm>

More information about the Catalyst mailing list