Mercurial > pub > Impl
diff Lib/IMPL/Web/Application/Action.pm @ 321:3dc9260017ad
Added JSON support for the request action
author | cin |
---|---|
date | Mon, 20 May 2013 01:14:27 +0400 |
parents | 28eba7e0c592 |
children | cca158327c47 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/Action.pm Thu May 16 17:16:41 2013 +0400 +++ b/Lib/IMPL/Web/Application/Action.pm Mon May 20 01:14:27 2013 +0400 @@ -6,6 +6,7 @@ use IMPL::Const qw(:prop); use IMPL::Web::CGIWrapper(); use URI; +use JSON; use IMPL::declare { base => [ @@ -15,7 +16,8 @@ props => [ application => PROP_RO, query => PROP_RO, - context => PROP_RW + context => PROP_RW, + _jsonData => PROP_RW, ] }; @@ -49,9 +51,9 @@ if ( $this->requestMethod eq 'GET' or - $this->query->content_type eq 'multipart/form-data' + $this->contentType eq 'multipart/form-data' or - $this->query->content_type eq 'application/x-www-form-urlencoded' + $this->contentType eq 'application/x-www-form-urlencoded' ) { $value = scalar( $this->query->param($name) ); } else { @@ -68,9 +70,9 @@ } sub rawData { - my ($this) = @_; + my ($this, $decode) = @_; - local $IMPL::Web::CGIWrapper::NO_DECODE = 1; + local $IMPL::Web::CGIWrapper::NO_DECODE = $decode ? 0 : 1; if ($this->requestMethod eq 'POST') { return $this->query->param('POSTDATA'); } elsif($this->requestMethod eq 'PUT') { @@ -78,6 +80,22 @@ } } +sub jsonData { + my ($this) = @_; + + if ($this->contentType =~ m{^application/json} ) { + my $data = $this->_jsonData; + unless($data) { + $data = JSON->new()->decode($this->rawData('decode encoding')); + $this->_jsonData($data); + } + + return $data; + } + + return; +} + sub requestMethod { my ($this) = @_; return $this->query->request_method;