changeset 321:3dc9260017ad

Added JSON support for the request action
author cin
date Mon, 20 May 2013 01:14:27 +0400
parents 28eba7e0c592
children cca158327c47
files Lib/IMPL/Web/Application/Action.pm Lib/IMPL/Web/PreconditionException.pm
diffstat 2 files changed, 56 insertions(+), 5 deletions(-) [+]
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;
--- /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<IMPL::Web::PreconditionException> - 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