X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2FClient.php;h=e91ec51cf8e3521ae7b06c40442bbccc6bd553a4;hb=c672d42d1109a5daa4cf243ba1f0383717e43104;hp=79948e86b7ef565ad1733dd8dd3c65fcb1f781a4;hpb=20a65226a4dad0def0ed1b34ac37c0a539fb2495;p=plcapi.git diff --git a/src/Client.php b/src/Client.php index 79948e8..e91ec51 100644 --- a/src/Client.php +++ b/src/Client.php @@ -137,6 +137,16 @@ class Client // by default the xml parser can support these 3 charset encodings $this->accepted_charset_encodings = array('UTF-8', 'ISO-8859-1', 'US-ASCII'); + // Add all charsets which mbstring can handle, but remove junk not found in IANA registry at + // in http://www.iana.org/assignments/character-sets/character-sets.xhtml + // NB: this is disabled to avoid making all the requests sent huge... mbstring supports more than 80 charsets! + /*if (function_exists('mb_list_encodings')) { + + $encodings = array_diff(mb_list_encodings(), array('pass', 'auto', 'wchar', 'BASE64', 'UUENCODE', 'ASCII', + 'HTML-ENTITIES', 'Quoted-Printable', '7bit','8bit', 'byte2be', 'byte2le', 'byte4be', 'byte4le')); + $this->accepted_charset_encodings = array_unique(array_merge($this->accepted_charset_encodings, $encodings)); + }*/ + // initialize user_agent string $this->user_agent = PhpXmlRpc::$xmlrpcName . ' ' . PhpXmlRpc::$xmlrpcVersion; } @@ -341,7 +351,7 @@ class Client * @param integer $timeout Connection timeout, in seconds, If unspecified, a platform specific timeout will apply * @param string $method if left unspecified, the http protocol chosen during creation of the object will be used * - * @return Response + * @return Response|Response[] */ public function send($req, $timeout = 0, $method = '') { @@ -352,7 +362,7 @@ class Client } if (is_array($req)) { - // $msg is an array of Requests + // $req is an array of Requests $r = $this->multicall($req, $timeout, $method); return $r; @@ -363,7 +373,7 @@ class Client } // where req is a Request - $req->debug = $this->debug; + $req->setDebug($this->debug); if ($method == 'https') { $r = $this->sendPayloadHTTPS( @@ -422,7 +432,8 @@ class Client $this->proxyport, $this->proxy_user, $this->proxy_pass, - $this->proxy_authtype + $this->proxy_authtype, + $method ); } @@ -442,14 +453,16 @@ class Client * @param string $proxyUsername * @param string $proxyPassword * @param int $proxyAuthType + * @param string $method * @return Response */ protected function sendPayloadHTTP10($req, $server, $port, $timeout = 0, $username = '', $password = '', $authType = 1, $proxyHost = '', - $proxyPort = 0, $proxyUsername = '', $proxyPassword = '', $proxyAuthType = 1) + $proxyPort = 0, $proxyUsername = '', $proxyPassword = '', $proxyAuthType = 1, + $method='http') { if ($port == 0) { - $port = 80; + $port = ( $method === "https" ) ? 443 : 80; } // Only create the payload if it was not created previously @@ -498,6 +511,7 @@ class Client } $connectServer = $proxyHost; $connectPort = $proxyPort; + $transport = "tcp"; $uri = 'http://' . $server . ':' . $port . $this->path; if ($proxyUsername != '') { if ($proxyAuthType != 1) { @@ -508,6 +522,8 @@ class Client } else { $connectServer = $server; $connectPort = $port; + /// @todo if supporting https, we should support all its current options as well: peer name verification etc... + $transport = ( $method === "https" ) ? "tls" : "tcp"; $uri = $this->path; } @@ -557,12 +573,12 @@ class Client } if ($timeout > 0) { - $fp = @fsockopen($connectServer, $connectPort, $this->errno, $this->errstr, $timeout); + $fp = @stream_socket_client("$transport://$connectServer:$connectPort", $this->errno, $this->errstr, $timeout); } else { - $fp = @fsockopen($connectServer, $connectPort, $this->errno, $this->errstr); + $fp = @stream_socket_client("$transport://$connectServer:$connectPort", $this->errno, $this->errstr); } if ($fp) { - if ($timeout > 0 && function_exists('stream_set_timeout')) { + if ($timeout > 0) { stream_set_timeout($fp, $timeout); } } else { @@ -634,7 +650,7 @@ class Client * Requires curl to be built into PHP * NB: CURL versions before 7.11.10 cannot use proxy to talk to https servers! * - * @param Request $msg + * @param Request $req * @param string $server * @param int $port * @param int $timeout @@ -657,7 +673,7 @@ class Client * @param int $sslVersion * @return Response */ - protected function sendPayloadCURL($msg, $server, $port, $timeout = 0, $username = '', + protected function sendPayloadCURL($req, $server, $port, $timeout = 0, $username = '', $password = '', $authType = 1, $cert = '', $certPass = '', $caCert = '', $caCertDir = '', $proxyHost = '', $proxyPort = 0, $proxyUsername = '', $proxyPassword = '', $proxyAuthType = 1, $method = 'https', $keepAlive = false, $key = '', $keyPass = '', $sslVersion = 0) @@ -684,12 +700,12 @@ class Client } // Only create the payload if it was not created previously - if (empty($msg->payload)) { - $msg->createPayload($this->request_charset_encoding); + if (empty($req->payload)) { + $req->createPayload($this->request_charset_encoding); } // Deflate request body and set appropriate request headers - $payload = $msg->payload; + $payload = $req->payload; if (function_exists('gzdeflate') && ($this->request_compression == 'gzip' || $this->request_compression == 'deflate')) { if ($this->request_compression == 'gzip') { $a = @gzencode($payload); @@ -722,10 +738,11 @@ class Client } // results into variable - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - if ($this->debug) { - curl_setopt($curl, CURLOPT_VERBOSE, 1); + if ($this->debug > 1) { + curl_setopt($curl, CURLOPT_VERBOSE, true); + /// @todo allow callers to redirect curlopt_stderr to some stream which can be buffered } curl_setopt($curl, CURLOPT_USERAGENT, $this->user_agent); // required for XMLRPC: post the data @@ -749,7 +766,7 @@ class Client } } // extra headers - $headers = array('Content-Type: ' . $msg->content_type, 'Accept-Charset: ' . implode(',', $this->accepted_charset_encodings)); + $headers = array('Content-Type: ' . $req->content_type, 'Accept-Charset: ' . implode(',', $this->accepted_charset_encodings)); // if no keepalive is wanted, let the server know it in advance if (!$keepAlive) { $headers[] = 'Connection: close'; @@ -864,7 +881,7 @@ class Client if (!$keepAlive) { curl_close($curl); } - $resp = $msg->parseResponse($result, true, $this->return_type); + $resp = $req->parseResponse($result, true, $this->return_type); // if we got back a 302, we can not reuse the curl handle for later calls if ($resp->faultCode() == PhpXmlRpc::$xmlrpcerr['http_error'] && $keepAlive) { curl_close($curl); @@ -1036,32 +1053,36 @@ class Client if ($rets->kindOf() != 'array') { return false; // bad return type from system.multicall } - $numRets = $rets->arraysize(); + $numRets = $rets->count(); if ($numRets != count($reqs)) { return false; // wrong number of return values. } $response = array(); - for ($i = 0; $i < $numRets; $i++) { - $val = $rets->arraymem($i); + //for ($i = 0; $i < $numRets; $i++) { + foreach($rets as $val) { + //$val = $rets->arraymem($i); switch ($val->kindOf()) { case 'array': - if ($val->arraysize() != 1) { + if ($val->count() != 1) { return false; // Bad value } // Normal return value - $response[$i] = new Response($val->arraymem(0)); + //$response[] = new Response($val->arraymem(0)); + $response[] = new Response($val[0]); break; case 'struct': - $code = $val->structmem('faultCode'); + //$code = $val->structmem('faultCode'); + $code = $val['faultCode']; if ($code->kindOf() != 'scalar' || $code->scalartyp() != 'int') { return false; } - $str = $val->structmem('faultString'); + //$str = $val->structmem('faultString'); + $str = $val['faultString']; if ($str->kindOf() != 'scalar' || $str->scalartyp() != 'string') { return false; } - $response[$i] = new Response(0, $code->scalarval(), $str->scalarval()); + $response[] = new Response(0, $code->scalarval(), $str->scalarval()); break; default: return false;