# HG changeset patch # User cin # Date 1368998067 -14400 # Node ID 3dc9260017ad99f70dedeb4e17b83c6278a2ef24 # Parent 28eba7e0c592870e06f000172a38c07290ef4719 Added JSON support for the request action diff -r 28eba7e0c592 -r 3dc9260017ad Lib/IMPL/Web/Application/Action.pm --- 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; diff -r 28eba7e0c592 -r 3dc9260017ad Lib/IMPL/Web/PreconditionException.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/PreconditionException.pm Mon May 20 01:14:27 2013 +0400 @@ -0,0 +1,33 @@ +package IMPL::Web::PreconditionException; +use strict; + +use IMPL::declare { + base => { + 'IMPL::Web::Exception' => '@_' + } +}; + +use IMPL::Resources::Strings { + message => "Precondition Failed" +}; + +sub status { + "412 Precondition Failed" +} + +1; + +__END__ + +=pod + +=head1 NAME + +C - The precondition given in one or more of +the request-header fields evaluated to false when it was tested on the server. + +This response code allows the client to place preconditions on the current +resource metainformation (header field data) and thus prevent the requested +method from being applied to a resource other than the one intended. + +=cut \ No newline at end of file