| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | <?php/*					COPYRIGHTCopyright 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 modifyit under the terms of the GNU General Public License as published bythe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with JSON-RPC PHP; if not, write to the Free SoftwareFoundation, 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 {		/**	 * 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;	}		/**	 * 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";				// 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)) {			$response = '';			while($row = fgets($fp)) {				$response.= trim($row)."\n";			}			$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);		}				// 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;		}	}}?>
 |