Code

Added json RPC based on curl
authorhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Fri, 28 May 2010 14:00:37 +0000 (14:00 +0000)
committerhickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8>
Fri, 28 May 2010 14:00:37 +0000 (14:00 +0000)
git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@18788 594d385d-05f5-0310-b6e9-bd551577e9d8

gosa-core/include/class_jsonRPC.inc [new file with mode: 0644]

diff --git a/gosa-core/include/class_jsonRPC.inc b/gosa-core/include/class_jsonRPC.inc
new file mode 100644 (file)
index 0000000..bcfe946
--- /dev/null
@@ -0,0 +1,163 @@
+<?php
+/*
+                                       COPYRIGHT
+
+Copyright 2007 Sergio Vaccaro <sergio@inservibile.org>
+
+This file is part of JSON-RPC PHP.
+
+JSON-RPC PHP is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+JSON-RPC PHP is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with JSON-RPC PHP; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+/**
+ * The object of this class are generic jsonRPC 1.0 clients
+ * http://json-rpc.org/wiki/specification
+ *
+ * @author sergio <jsonrpcphp@inservibile.org>
+ */
+class jsonRPCClient {
+
+    private $curlHandler = NULL;
+       
+       /**
+        * Debug state
+        *
+        * @var boolean
+        */
+       private $debug;
+       
+       /**
+        * The server URL
+        *
+        * @var string
+        */
+       private $url;
+       /**
+        * The request id
+        *
+        * @var integer
+        */
+       private $id;
+       /**
+        * If true, notifications are performed instead of requests
+        *
+        * @var boolean
+        */
+       private $notification = false;
+       
+       /**
+        * Takes the connection parameters
+        *
+        * @param string $url
+        * @param boolean $debug
+        */
+       public function __construct($url,$debug = false) {
+               // server URL
+               $this->url = $url;
+               // proxy
+               empty($proxy) ? $this->proxy = '' : $this->proxy = $proxy;
+               // debug state
+               empty($debug) ? $this->debug = false : $this->debug = true;
+               // message id
+               $this->id = 1;
+        
+        // Init Curl handler
+        $this->curlHandler = curl_init($this->url);
+        curl_setopt($this->curlHandler, CURLOPT_URL , $this->url);
+        curl_setopt($this->curlHandler, CURLOPT_COOKIESESSION , TRUE);
+        curl_setopt($this->curlHandler, CURLOPT_COOKIEFILE, 'cookiefile.txt'); 
+       }
+       
+       /**
+        * Sets the notification state of the object. In this state, notifications are performed, instead of requests.
+        *
+        * @param boolean $notification
+        */
+       public function setRPCNotification($notification) {
+               empty($notification) ?
+                                                       $this->notification = false
+                                                       :
+                                                       $this->notification = true;
+       }
+       
+       /**
+        * Performs a jsonRCP request and gets the results as an array
+        *
+        * @param string $method
+        * @param array $params
+        * @return array
+        */
+       public function __call($method,$params) {
+               
+               // check
+               if (!is_scalar($method)) {
+                       throw new Exception('Method name has no scalar value');
+               }
+               
+               // check
+               if (is_array($params)) {
+                       // no keys
+                       $params = array_values($params);
+               } else {
+                       throw new Exception('Params must be given as array');
+               }
+               
+               // sets notification or request task
+               if ($this->notification) {
+                       $currentId = NULL;
+               } else {
+                       $currentId = $this->id;
+               }
+               
+               // prepares the request
+               $request = array(
+                                               'method' => $method,
+                                               'params' => $params,
+                                               'id' => $currentId
+                                               );
+               $request = json_encode($request);
+               $this->debug && $this->debug.='***** Request *****'."\n".$request."\n".'***** End Of request *****'."\n\n";
+       
+        curl_setopt($this->curlHandler, CURLOPT_POST , TRUE);
+        curl_setopt($this->curlHandler, CURLOPT_POSTFIELDS , $request);
+        curl_setopt($this->curlHandler, CURLOPT_RETURNTRANSFER , TRUE);
+        curl_setopt($this->curlHandler, CURLOPT_HTTPHEADER , array('Content-Type: application/json'));
+        $response = curl_exec($this->curlHandler);        
+               $this->debug && $this->debug.='***** Server response *****'."\n".$response.'***** End of server response *****'."\n";
+         $response = json_decode($response,true);
+
+               // debug output
+               if ($this->debug) {
+                       echo nl2br($debug);
+               }
+               
+               // final checks and return
+               if (!$this->notification) {
+                       // check
+                       if ($response['id'] != $currentId) {
+                               throw new Exception('Incorrect response id (request id: '.$currentId.', response id: '.$response['id'].')');
+                       }
+                       if (!is_null($response['error'])) {
+                               throw new Exception('Request error: '.$response['error']);
+                       }
+                       
+                       return $response['result'];
+                       
+               } else {
+                       return true;
+               }
+       }
+}
+?>