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;