From a1c79766655ff39904b2307d3fbc203af1430079 Mon Sep 17 00:00:00 2001 From: hickert Date: Fri, 28 May 2010 14:00:37 +0000 Subject: [PATCH] Added json RPC based on curl git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@18788 594d385d-05f5-0310-b6e9-bd551577e9d8 --- gosa-core/include/class_jsonRPC.inc | 163 ++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 gosa-core/include/class_jsonRPC.inc diff --git a/gosa-core/include/class_jsonRPC.inc b/gosa-core/include/class_jsonRPC.inc new file mode 100644 index 000000000..bcfe9467e --- /dev/null +++ b/gosa-core/include/class_jsonRPC.inc @@ -0,0 +1,163 @@ + + +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 + */ +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; + } + } +} +?> -- 2.30.2