- /**
- * RPC namespace
- *
- * @var string
- */
- public $namespace;
-
- /**
- * HttpRequest instance
- *
- * @var HttpRequest
- */
- protected $request;
-
- /**
- * Constructor
- *
- * @param string $url RPC endpoint
- * @param string $namespace RPC namespace
- */
- public function __construct($url, $namespace = '')
- {
- $this->namespace = $namespace;
- $this->request = new HttpRequest($url, HTTP_METH_POST);
- $this->request->setContentType('text/xml');
- }
-
- /**
- * Proxy to HttpRequest::setOptions()
- *
- * @param array $options
- * @return unknown
- */
- public function setOptions(array $options = null)
- {
- return $this->request->setOptions($options);
- }
-
- /**
- * Get associated HttpRequest instance
- *
- * @return HttpRequest
- */
- public function getRequest()
- {
- return $this->request;
- }
-
- /**
- * RPC method proxy
- *
- * @param string $method RPC method name
- * @param array $params RPC method arguments
- * @return mixed decoded RPC response
- * @throws Exception
- */
- public function __call($method, array $params)
- {
- if ($this->namespace) {
- $method = $this->namespace .'.'. $method;
- }
- $this->request->setRawPostData(xmlrpc_encode_request($method, $params));
- $response = $this->request->send();
- if ($response->getResponseCode() != 200) {
- throw new Exception($response->getBody(), $response->getResponseCode());
- }
- return xmlrpc_decode($response->getBody(), 'utf-8');
- }
+ /**
+ * RPC namespace
+ *
+ * @var string
+ */
+ public $__namespace;
+
+ /**
+ * HttpRequest instance
+ *
+ * @var HttpRequest
+ */
+ public $__request;
+
+ /**
+ * Client charset
+ *
+ * @var string
+ */
+ public $__encoding = "iso-8859-1";
+
+ /**
+ * Constructor
+ *
+ * @param string $url RPC endpoint
+ * @param string $namespace RPC namespace
+ * @param array $options HttpRequest options
+ */
+ public function __construct($url, $namespace = '', array $options = null)
+ {
+ $this->__request = new HttpRequest($url, HTTP_METH_POST);
+ $this->__request->setOptions($options);
+ $this->__namespace = $namespace;
+ }
+
+ /**
+ * RPC method proxy
+ *
+ * @param string $method RPC method name
+ * @param array $params RPC method arguments
+ * @return mixed decoded RPC response
+ * @throws Exception
+ */
+ public function __call($method, array $params)
+ {
+ if ($this->__namespace) {
+ $method = $this->__namespace .'.'. $method;
+ }
+ $this->__request->setContentType("text/xml; charset=". $this->__encoding);
+ $request = xmlrpc_encode_request($method, $params, array("encoding" => $this->__encoding));
+ $this->__request->setRawPostData($request);
+ $this->__request->send();
+ $response = $this->__request->getResponseMessage();
+ if ($response->getResponseCode() != 200) {
+ throw new Exception(
+ $response->getResponseStatus(),
+ $response->getResponseCode()
+ );
+ }
+
+ $data = xmlrpc_decode($response->getBody(), $this->__encoding);
+ if (xmlrpc_is_fault($data)) {
+ throw new Exception(
+ (string) $data['faultString'],
+ (int) $data['faultCode']
+ );
+ }
+
+ return $data;
+ }
+
+ /**
+ * Returns self, where namespace is set to variable name
+ *
+ * @param string $ns
+ * @return XmlRpcRequest
+ */
+ public function __get($ns)
+ {
+ $this->__namespace = $ns;
+ return $this;
+ }