*/
class Client
{
+ const USE_CURL_NEVER = 0;
+ const USE_CURL_ALWAYS = 1;
+ const USE_CURL_AUTO = 2;
+
/// @todo: do these need to be public?
public $method = 'http';
public $server;
public $cookies = array();
public $extracurlopts = array();
+ public $use_curl = self::USE_CURL_AUTO;
/**
* @var bool
* NNB: you can set it to any non-empty array for HTTP11 and HTTPS, since
* in those cases it will be up to CURL to decide the compression methods
* it supports. You might check for the presence of 'zlib' in the output of
- * curl_version() to determine wheter compression is supported or not
+ * curl_version() to determine whether compression is supported or not
*/
public $accepted_compression = array();
*/
public $request_compression = '';
+
/**
* CURL handle: used for keep-alive connections (PHP 4.3.8 up, see:
* http://curl.haxx.se/docs/faq.html#7.3).
$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
+ // 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')) {
* This option can be very useful when debugging servers as it allows you to see exactly what the client sends and
* the server returns.
*
- * @param integer $in values 0, 1 and 2 are supported (2 = echo sent msg too, before received response)
+ * @param integer $level values 0, 1 and 2 are supported (2 = echo sent msg too, before received response)
*/
public function setDebug($level)
{
$this->extracurlopts = $options;
}
+ /**
+ * @param int $useCurlMode self::USE_CURL_ALWAYS, self::USE_CURL_AUTO or self::USE_CURL_NEVER
+ */
+ public function setUseCurl($useCurlMode)
+ {
+ $this->use_curl = $useCurlMode;
+ }
+
+
/**
* Set user-agent string that will be used by this client instance in http headers sent to the server.
*
$req->setDebug($this->debug);
/// @todo we could be smarter about this and force usage of curl in scenarios where it is both available and
- /// needed, such as digest or ntlm auth
- $useCurl = ($method == 'https' || $method == 'http11');
+ /// needed, such as digest or ntlm auth. Do not attempt to use it for https if not present
+ $useCurl = ($this->use_curl == self::USE_CURL_ALWAYS) || ($this->use_curl == self::USE_CURL_AUTO &&
+ ($method == 'https' || $method == 'http11'));
if ($useCurl) {
$r = $this->sendPayloadCURL(
$this->proxy_pass,
$this->proxy_authtype,
$method,
- $this->keepalive,
$this->key,
$this->keypass,
$this->sslversion
$authType = 1, $proxyHost = '', $proxyPort = 0, $proxyUsername = '', $proxyPassword = '', $proxyAuthType = 1,
$method='http')
{
+ //trigger_error('Method ' . __METHOD__ . ' is deprecated', E_USER_DEPRECATED);
+
return $this->sendPayloadSocket($req, $server, $port, $timeout, $username, $password, $authType, null, null,
- null, null, $proxyHost, $proxyPort, $proxyUsername, $proxyPassword, $proxyAuthType);
+ null, null, $proxyHost, $proxyPort, $proxyUsername, $proxyPassword, $proxyAuthType, $method);
}
/**
$proxyUsername = '', $proxyPassword = '', $proxyAuthType = 1, $keepAlive = false, $key = '', $keyPass = '',
$sslVersion = 0)
{
+ //trigger_error('Method ' . __METHOD__ . ' is deprecated', E_USER_DEPRECATED);
+
return $this->sendPayloadCURL($req, $server, $port, $timeout, $username,
$password, $authType, $cert, $certPass, $caCert, $caCertDir, $proxyHost, $proxyPort,
$proxyUsername, $proxyPassword, $proxyAuthType, 'https', $keepAlive, $key, $keyPass, $sslVersion);
$payload = $req->payload;
// Deflate request body and set appropriate request headers
+ $encodingHdr = '';
if (function_exists('gzdeflate') && ($this->request_compression == 'gzip' || $this->request_compression == 'deflate')) {
if ($this->request_compression == 'gzip') {
$a = @gzencode($payload);
$encodingHdr = "Content-Encoding: deflate\r\n";
}
}
- } else {
- $encodingHdr = '';
}
// thanks to Grant Rauscher <grant7@firstworld.net> for this
} 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;
}
$contextOptions['ssl']['local_pk'] = $key;
}
$contextOptions['ssl']['verify_peer'] = $this->verifypeer;
-
+ $contextOptions['ssl']['verify_peer_name'] = $this->verifypeer;
}
$context = stream_context_create($contextOptions);
$connectTimeout = $timeout;
}
+ $this->errno = 0;
+ $this->errstr = '';
+
$fp = @stream_socket_client("$transport://$connectServer:$connectPort", $this->errno, $this->errstr, $connectTimeout,
STREAM_CLIENT_CONNECT, $context);
if ($fp) {
stream_set_timeout($fp, $timeout);
}
} else {
+ if ($this->errstr == '') {
+ $err = error_get_last();
+ $this->errstr = $err['message'];
+ }
$this->errstr = 'Connect error: ' . $this->errstr;
$r = new Response(0, PhpXmlRpc::$xmlrpcerr['http_error'], $this->errstr . ' (' . $this->errno . ')');
$r = new Response(0, PhpXmlRpc::$xmlrpcerr['http_error'], $this->errstr);
return $r;
- } else {
- // reset errno and errstr on successful socket connection
- $this->errstr = '';
}
+
// G. Giunta 2005/10/24: close socket before parsing.
// should yield slightly better execution times, and make easier recursive calls (e.g. to follow http redirects)
$ipd = '';
$ipd .= fread($fp, 32768);
} while (!feof($fp));
fclose($fp);
+
$r = $req->parseResponse($ipd, false, $this->return_type);
return $r;
break;
case 'struct':
$code = $val['faultCode'];
+ /** @var Value $code */
if ($code->kindOf() != 'scalar' || $code->scalartyp() != 'int') {
return false;
}
$str = $val['faultString'];
+ /** @var Value $str */
if ($str->kindOf() != 'scalar' || $str->scalartyp() != 'string') {
return false;
}