X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FRequest.pm;h=ab87e17e24f504223f9ccf1bdc61efcfa6681266;hp=f75319b699f23a5e2f9cd327ec80136f217ca88a;hb=974733c0febbddd53145ec82031b4ad6abcc0985;hpb=ade3da0a3602627512932eef9af511247f11634f diff --git a/lib/Catalyst/Request.pm b/lib/Catalyst/Request.pm index f75319b..ab87e17 100644 --- a/lib/Catalyst/Request.pm +++ b/lib/Catalyst/Request.pm @@ -92,10 +92,10 @@ has _log => ( ); has io_fh => ( - is=>'ro', - predicate=>'has_io_fh', - lazy=>1, - builder=>'_build_io_fh'); + is=>'ro', + predicate=>'has_io_fh', + lazy=>1, + builder=>'_build_io_fh'); sub _build_io_fh { my $self = shift; @@ -103,16 +103,27 @@ sub _build_io_fh { || die "Your Server does not support psgix.io"; }; -has body_fh => ( - is=>'ro', - predicate=>'has_body_fh', - lazy=>1, - builder=>'_build_body_fh'); +has data_handlers => ( is=>'ro', isa=>'HashRef', default=>sub { +{} } ); -sub _build_body_fh { - (my $input_fh = shift->env->{'psgi.input'})->seek(0, 0); - return $input_fh; -}; +has body_data => ( + is=>'ro', + lazy=>1, + builder=>'_build_body_data'); + +sub _build_body_data { + my ($self) = @_; + my $content_type = $self->content_type; + my ($match) = grep { $content_type =~/$_/i } + keys(%{$self->data_handlers}); + + if($match) { + my $fh = $self->body; + local $_ = $fh; + return $self->data_handlers->{$match}->($fh, $self); + } else { + return undef; + } +} # Amount of data to read from input on each pass our $CHUNKSIZE = 64 * 1024; @@ -182,8 +193,6 @@ sub prepare_parameters { return $self->parameters; } - - sub _build_parameters { my ( $self ) = @_; my $parameters = {}; @@ -342,6 +351,7 @@ Catalyst::Request - provides information about the current client request $req->args; $req->base; $req->body; + $req->body_data; $req->body_parameters; $req->content_encoding; $req->content_length; @@ -424,6 +434,14 @@ Returns the message body of the request, as returned by L: a string, unless Content-Type is C, C, or C, in which case a L object is returned. +=head2 $req->body_data + +Returns a Perl representation of POST/PUT body data that is not classic HTML +form data, such as JSON, XML, etc. By default, Catalyst will parse incoming +data of the type 'application/json' and return access to that data via this +method. You may define addition data_handlers via a global configuration +setting. See L for more information. + =head2 $req->body_parameters Returns a reference to a hash containing body (POST) parameters. Values can