Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,34 @@ | ||
<?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 | ||
*/ | ||
* Copyright 2007 Sergio Vaccaro <sergio@inservibile.org> | ||
* Copyright 2012, 2015 Johannes Weberhofer <jweberhofer@weberhofer.at> | ||
* | ||
* 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 | ||
* | ||
* @see http://json-rpc.org/wiki/specification | ||
* @license GPLv2+ | ||
* @author sergio <jsonrpcphp@inservibile.org> | ||
* @author Johannes Weberhofer <jweberhofer@weberhofer.at> | ||
*/ | ||
|
||
class jsonRPCClient | ||
{ | ||
|
||
|
@@ -35,56 +37,69 @@ class jsonRPCClient | |
* | ||
* @var boolean | ||
*/ | ||
private $debug; | ||
private $debug = false; | ||
|
||
/** | ||
* The server URL | ||
* | ||
* @var string | ||
*/ | ||
private $url; | ||
|
||
/** | ||
* Proxy to be used | ||
* | ||
* @var string | ||
*/ | ||
private $proxy = null; | ||
|
||
/** | ||
* The request id | ||
* | ||
* @var integer | ||
*/ | ||
private $id; | ||
|
||
/** | ||
* If true, notifications are performed instead of requests | ||
* | ||
* @var boolean | ||
*/ | ||
private $notification = false; | ||
|
||
/** | ||
* If false, requests will be forced to use fopen() instead. | ||
* This option is specific in case of cURL is callable but may not practically unsable. | ||
* | ||
* @var boolean | ||
*/ | ||
private $enableCurl = true; | ||
|
||
/** | ||
* Takes the connection parameters | ||
* | ||
* @param string $url | ||
* @param boolean $debug | ||
* @param string $proxy | ||
*/ | ||
public function __construct($url, $debug = false) | ||
public function __construct($url, $debug = false, $proxy = null) | ||
{ | ||
// server URL | ||
$this->url = $url; | ||
// proxy | ||
empty($proxy) ? $this->proxy = '' : $this->proxy = $proxy; | ||
// debug state | ||
empty($debug) ? $this->debug = false : $this->debug = true; | ||
$this->proxy = $proxy; | ||
$this->debug = ($this->debug === true); | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
gabrieljenik
Collaborator
|
||
// message id | ||
$this->id = 1; | ||
} | ||
|
||
/** | ||
* Sets the notification state of the object. In this state, notifications are performed, instead of requests. | ||
* 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; | ||
empty($notification) ? $this->notification = false : $this->notification = true; | ||
} | ||
|
||
/** | ||
|
@@ -98,16 +113,16 @@ public function __call($method, $params) | |
{ | ||
|
||
// check | ||
if (!is_scalar($method)) { | ||
throw new Exception('Method name has no scalar value'); | ||
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'); | ||
throw new \Exception('Params must be given as array'); | ||
} | ||
|
||
// sets notification or request task | ||
|
@@ -119,58 +134,86 @@ public function __call($method, $params) | |
|
||
// prepares the request | ||
$request = array( | ||
'method' => $method, | ||
'params' => $params, | ||
'id' => $currentId | ||
); | ||
'method' => $method, | ||
'params' => $params, | ||
'id' => $currentId | ||
); | ||
$request = json_encode($request); | ||
$this->debug && $this->debug .= '***** Request *****'."\n".$request."\n".'***** End Of request *****'."\n\n"; | ||
if ($this->debug) { | ||
echo '***** Request *****' . "\n" . $request . "\n"; | ||
} | ||
|
||
// performs the HTTP POST | ||
$opts = array('http' => array( | ||
'method' => 'POST', | ||
'header' => 'Content-type: application/json', | ||
'content' => $request | ||
)); | ||
$context = stream_context_create($opts); | ||
if ($fp = fopen($this->url, 'r', false, $context)) { | ||
stream_set_timeout($fp, 120); | ||
$response = ''; | ||
while ($row = fgets($fp)) { | ||
$response .= trim($row)."\n"; | ||
if ($this->enableCurl && is_callable('curl_init')) { | ||
// use curl when available; solves problems with allow_url_fopen | ||
$ch = curl_init($this->url); | ||
curl_setopt($ch, CURLOPT_POST, 1); | ||
curl_setopt($ch, CURLOPT_HTTPHEADER, array( | ||
'Content-type: application/json' | ||
)); | ||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); | ||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); | ||
curl_setopt($ch, CURLOPT_POSTFIELDS, $request); | ||
if ($this->proxy !== null && trim($this->proxy) !== '') { | ||
curl_setopt($ch, CURLOPT_PROXY, $this->proxy); | ||
} | ||
$response = curl_exec($ch); | ||
if ($response === false) { | ||
throw new \Exception('Unable to connect to ' . $this->url); | ||
} | ||
$this->debug && $this->debug .= '***** Server response *****'."\n".$response.'***** End of server response *****'."\n"; | ||
$response = json_decode($response, true); | ||
} else { | ||
throw new Exception('Unable to connect to '.$this->url); | ||
$opts = array( | ||
'http' => array( | ||
'method' => 'POST', | ||
'header' => 'Content-type: application/json', | ||
'content' => $request | ||
) | ||
); | ||
$context = stream_context_create($opts); | ||
|
||
if ($fp = fopen($this->url, 'r', false, $context)) { | ||
$response = ''; | ||
while ($row = fgets($fp)) { | ||
$response .= trim($row) . "\n"; | ||
} | ||
} else { | ||
throw new \Exception('Unable to connect to ' . $this->url); | ||
} | ||
} | ||
|
||
// debug output | ||
if ($this->debug) { | ||
echo nl2br($this->debug); | ||
$this->debug = true; | ||
echo '***** Response *****' . "\n" . $response . "\n" . '***** End of Response *****' . "\n\n"; | ||
} | ||
$response = json_decode($response, true); | ||
|
||
// final checks and return | ||
if (!$this->notification) { | ||
if (! $this->notification) { | ||
// check | ||
if ($response['id'] != $currentId) { | ||
throw new Exception('Incorrect response id (request id: '.$currentId.', response id: '.$response['id'].')'); | ||
throw new \Exception('Incorrect response id: ' . $response['id'] . ' (request id: ' . $currentId . ')'); | ||
} | ||
if (!is_null($response['error'])) { | ||
throw new Exception('Request error: '.$response['error']); | ||
if (array_key_exists('error', $response) && $response['error'] !== null) { | ||
throw new \Exception('Request error: ' . json_encode($response['error'])); | ||
} | ||
|
||
return $response['result']; | ||
|
||
} else { | ||
return true; | ||
} | ||
} | ||
|
||
This comment has been minimized.
Sorry, something went wrong.
gabrieljenik
Collaborator
|
||
public function call($method, $params) | ||
{ | ||
return $this->__call($method, $params); | ||
} | ||
|
||
/** | ||
* Enable cURL when performs a jsonRCP request. | ||
*/ | ||
public function enableCurl() | ||
{ | ||
$this->enableCurl = true; | ||
} | ||
|
||
/** | ||
* Disable cURL when performs a jsonRCP request. | ||
*/ | ||
public function disableCurl() | ||
{ | ||
$this->enableCurl = false; | ||
} | ||
} | ||
?> |
4 comments
on commit ddde6a4
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will all these adjustments be backwards compatible? If I am updating an older LS 3 system which makes use of JSON RPC and API calls, will there be any issues?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
They should be. Otherwise I'll revert the commit.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Didn't have time to test so much.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
jsonRPCServer.php update seems very light. More clear error (real http error) : think it's better :) and can not broke existing working system
This always return false. It should be
$debug