HTTP::Entity::Parser - PSGI compliant HTTP Entity Parser
use HTTP::Entity::Parser; my $parser = HTTP::Entity::Parser->new; $parser->register('application/x-www-form-urlencoded','HTTP::Entity::Parser::UrlEncoded'); $parser->register('multipart/form-data','HTTP::Entity::Parser::MultiPart'); $parser->register('application/json','HTTP::Entity::Parser::JSON'); sub app { my $env = shift; my ( $params, $uploads) = $parser->parse($env); }
HTTP::Entity::Parser is a PSGI-compliant HTTP Entity parser. This module also is compatible with HTTP::Body. Unlike HTTP::Body, HTTP::Entity::Parser reads HTTP entities from PSGI's environment $env->{'psgi.input'} and parses it. This module supports application/x-www-form-urlencoded, multipart/form-data and application/json.
$env->{'psgi.input'}
Create the instance.
The buffer length that HTTP::Entity::Parser reads from psgi.input. 16384 by default.
Register parser class.
$parser->register('application/x-www-form-urlencoded','HTTP::Entity::Parser::UrlEncoded'); $parser->register('multipart/form-data','HTTP::Entity::Parser::MultiPart'); $parser->register('application/json','HTTP::Entity::Parser::JSON');
If the request content_type matches the registered type, HTTP::Entity::Parser uses the registered parser class. If content_type does not match any registered type, HTTP::Entity::Parser::OctetStream is used.
parse HTTP entities from PSGI's env.
my ( $params:ArrayRef, $uploads:ArrayRef) = $parser->parse($env);
$param is a key-value pair list.
$param
my ( $params, $uploads) = $parser->parse($env); my $body_parameters = Hash::MultiValue->new(@$params);
$uploads is an ArrayRef of HashRef.
$uploads
my ( $params, $uploads) = $parser->parse($env); warn Dumper($uploads->[0]); { "name" => "upload", #field name "headers" => [ "Content-Type" => "application/octet-stream", "Content-Disposition" => "form-data; name=\"upload\"; filename=\"hello.pl\"" ], "size" => 78, #size of upload content "filename" => "hello.png", #original filename in the client "tempname" => "/tmp/XXXXX", # path to the temporary file where uploaded file is saved }
When used with Plack::Request::Upload:
my ( $params, $uploads) = $parser->parse($env); my $upload_hmv = Hash::MultiValue->new(); while ( my ($k,$v) = splice @$uploads, 0, 2 ) { my %copy = %$v; $copy{headers} = HTTP::Headers::Fast->new(@{$v->{headers}}); $upload_hmv->add($k, Plack::Request::Upload->new(%copy)); }
Default parser, This parser does not parse entity, always return empty list.
For application/x-www-form-urlencoded. It is used for HTTP POST without file upload
application/x-www-form-urlencoded
For multipart/form-data. It is used for HTTP POST contains file upload.
multipart/form-data
MultiPart parser use HTTP::MultiPartParser.
For application/json. This parser decodes JSON body automatically.
application/json
It is convenient to use with Ajax forms.
HTTP::Entity::Parser accept PSGI's env and read body from it.
HTTP::Entity::Parser is able to choose parsers by the instance, HTTP::Body requires to modify global variables.
HTTP::Entity::Parser uses this for parse application/x-www-form-urlencoded
Copyright (C) Masahiro Nagano.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Masahiro Nagano <kazeburo@gmail.com>
Tokuhiro Matsuno <tokuhirom@gmail.com>
This module is based on tokuhirom's code, see https://github.com/plack/Plack/pull/434
To install HTTP::Entity::Parser, copy and paste the appropriate command in to your terminal.
cpanm
cpanm HTTP::Entity::Parser
CPAN shell
perl -MCPAN -e shell install HTTP::Entity::Parser
For more information on module installation, please visit the detailed CPAN module installation guide.