* @param string $method valid values are 'http', 'http11' and 'https'. If left unspecified, the http protocol
* chosen during creation of the object will be used.
*
- *
* @return Response|Response[] Note that the client will always return a Response object, even if the call fails
*/
public function send($req, $timeout = 0, $method = '')
// where req is a Request
$req->setDebug($this->debug);
- if ($method == 'https') {
- $r = $this->sendPayloadHTTPS(
+ /// @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');
+
+ if ($useCurl) {
+ $r = $this->sendPayloadCURL(
$req,
$this->server,
$this->port,
$this->proxy_user,
$this->proxy_pass,
$this->proxy_authtype,
+ // bc
+ $method == 'http11' ? 'http' : $method,
$this->keepalive,
$this->key,
$this->keypass,
$this->sslversion
);
- } elseif ($method == 'http11') {
- $r = $this->sendPayloadCURL(
- $req,
- $this->server,
- $this->port,
- $timeout,
- $this->username,
- $this->password,
- $this->authtype,
- null,
- null,
- null,
- null,
- $this->proxy,
- $this->proxyport,
- $this->proxy_user,
- $this->proxy_pass,
- $this->proxy_authtype,
- 'http',
- $this->keepalive
- );
} else {
- $r = $this->sendPayloadHTTP10(
+ // plain 'http 1.0': default to using socket
+ $r = $this->sendPayloadSocket(
$req,
$this->server,
$this->port,
$this->username,
$this->password,
$this->authtype,
+ $this->cert,
+ $this->certpass,
+ $this->cacert,
+ $this->cacertdir,
$this->proxy,
$this->proxyport,
$this->proxy_user,
$this->proxy_pass,
$this->proxy_authtype,
- $method
+ $method,
+ $this->keepalive,
+ $this->key,
+ $this->keypass,
+ $this->sslversion
);
}
}
/**
+ * @deprecated
* @param Request $req
* @param string $server
* @param int $port
protected function sendPayloadHTTP10($req, $server, $port, $timeout = 0, $username = '', $password = '',
$authType = 1, $proxyHost = '', $proxyPort = 0, $proxyUsername = '', $proxyPassword = '', $proxyAuthType = 1,
$method='http')
+ {
+ return $this->sendPayloadSocket($req, $server, $port, $timeout, $username, $password, $authType, null, null,
+ null, null, $proxyHost, $proxyPort, $proxyUsername, $proxyPassword, $proxyAuthType);
+ }
+
+ /**
+ * @deprecated
+ * @param Request $req
+ * @param string $server
+ * @param int $port
+ * @param int $timeout
+ * @param string $username
+ * @param string $password
+ * @param int $authType
+ * @param string $cert
+ * @param string $certPass
+ * @param string $caCert
+ * @param string $caCertDir
+ * @param string $proxyHost
+ * @param int $proxyPort
+ * @param string $proxyUsername
+ * @param string $proxyPassword
+ * @param int $proxyAuthType
+ * @param bool $keepAlive
+ * @param string $key
+ * @param string $keyPass
+ * @param int $sslVersion
+ * @return Response
+ */
+ protected function sendPayloadHTTPS($req, $server, $port, $timeout = 0, $username = '', $password = '',
+ $authType = 1, $cert = '', $certPass = '', $caCert = '', $caCertDir = '', $proxyHost = '', $proxyPort = 0,
+ $proxyUsername = '', $proxyPassword = '', $proxyAuthType = 1, $keepAlive = false, $key = '', $keyPass = '',
+ $sslVersion = 0)
+ {
+ return $this->sendPayloadCURL($req, $server, $port, $timeout, $username,
+ $password, $authType, $cert, $certPass, $caCert, $caCertDir, $proxyHost, $proxyPort,
+ $proxyUsername, $proxyPassword, $proxyAuthType, 'https', $keepAlive, $key, $keyPass, $sslVersion);
+ }
+
+ /**
+ * @param Request $req
+ * @param string $server
+ * @param int $port
+ * @param int $timeout
+ * @param string $username
+ * @param string $password
+ * @param int $authType only value supported is 1
+ * @param string $cert
+ * @param string $certPass
+ * @param string $caCert
+ * @param string $caCertDir
+ * @param string $proxyHost
+ * @param int $proxyPort
+ * @param string $proxyUsername
+ * @param string $proxyPassword
+ * @param int $proxyAuthType only value supported is 1
+ * @param string $method 'http' (synonym for 'http10'), 'http10' or 'https'
+ * @param string $key
+ * @param string $keyPass @todo not implemented yet.
+ * @param int $sslVersion @todo not implemented yet. See http://php.net/manual/en/migration56.openssl.php
+ * @return Response
+ */
+ protected function sendPayloadSocket($req, $server, $port, $timeout = 0, $username = '', $password = '',
+ $authType = 1, $cert = '', $certPass = '', $caCert = '', $caCertDir = '', $proxyHost = '', $proxyPort = 0,
+ $proxyUsername = '', $proxyPassword = '', $proxyAuthType = 1, $method='http', $key = '', $keyPass = '',
+ $sslVersion = 0)
{
if ($port == 0) {
- $port = ( $method === "https" ) ? 443 : 80;
+ $port = ( $method === 'https' ) ? 443 : 80;
}
// Only create the payload if it was not created previously
}
$connectServer = $proxyHost;
$connectPort = $proxyPort;
- $transport = "tcp";
+ $transport = 'tcp';
$uri = 'http://' . $server . ':' . $port . $this->path;
if ($proxyUsername != '') {
if ($proxyAuthType != 1) {
$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";
+ $transport = ( $method === 'https' ) ? 'tls' : 'tcp';
$uri = $this->path;
}
$cookieHeader = 'Cookie:' . $version . substr($cookieHeader, 0, -1) . "\r\n";
}
- // omit port if 80
- $port = ($port == 80) ? '' : (':' . $port);
+ // omit port if default
+ if (($port == 80 && in_array($method, array('http', 'http10'))) || ($port == 443 && $method == 'https')) {
+ $port = '';
+ } else {
+ $port = ':' . $port;
+ }
$op = 'POST ' . $uri . " HTTP/1.0\r\n" .
'User-Agent: ' . $this->user_agent . "\r\n" .
Logger::instance()->debugMessage("---SENDING---\n$op\n---END---");
}
- if ($timeout > 0) {
- $fp = @stream_socket_client("$transport://$connectServer:$connectPort", $this->errno, $this->errstr, $timeout);
+ $contextOptions = array();
+ if ($method == 'https') {
+ if ($cert != '') {
+ $contextOptions['ssl']['local_cert'] = $cert;
+ if ($certPass != '') {
+ $contextOptions['ssl']['passphrase'] = $certPass;
+ }
+ }
+ if ($caCert != '') {
+ $contextOptions['ssl']['cafile'] = $caCert;
+ }
+ if ($caCertDir != '') {
+ $contextOptions['ssl']['capath'] = $caCertDir;
+ }
+ if ($key != '') {
+ $contextOptions['ssl']['local_pk'] = $key;
+ }
+ $contextOptions['ssl']['verify_peer'] = $this->verifypeer;
+
+ }
+ $context = stream_context_create($contextOptions);
+
+ if ($timeout <= 0) {
+ $connectTimeout = ini_get('default_socket_timeout');
} else {
- $fp = @stream_socket_client("$transport://$connectServer:$connectPort", $this->errno, $this->errstr);
+ $connectTimeout = $timeout;
}
+
+ $fp = @stream_socket_client("$transport://$connectServer:$connectPort", $this->errno, $this->errstr, $connectTimeout,
+ STREAM_CLIENT_CONNECT, $context);
if ($fp) {
if ($timeout > 0) {
stream_set_timeout($fp, $timeout);
return $r;
}
- /**
- * @param Request $req
- * @param string $server
- * @param int $port
- * @param int $timeout
- * @param string $username
- * @param string $password
- * @param int $authType
- * @param string $cert
- * @param string $certPass
- * @param string $caCert
- * @param string $caCertDir
- * @param string $proxyHost
- * @param int $proxyPort
- * @param string $proxyUsername
- * @param string $proxyPassword
- * @param int $proxyAuthType
- * @param bool $keepAlive
- * @param string $key
- * @param string $keyPass
- * @param int $sslVersion
- * @return Response
- */
- protected function sendPayloadHTTPS($req, $server, $port, $timeout = 0, $username = '', $password = '',
- $authType = 1, $cert = '', $certPass = '', $caCert = '', $caCertDir = '', $proxyHost = '', $proxyPort = 0,
- $proxyUsername = '', $proxyPassword = '', $proxyAuthType = 1, $keepAlive = false, $key = '', $keyPass = '',
- $sslVersion = 0)
- {
- return $this->sendPayloadCURL($req, $server, $port, $timeout, $username,
- $password, $authType, $cert, $certPass, $caCert, $caCertDir, $proxyHost, $proxyPort,
- $proxyUsername, $proxyPassword, $proxyAuthType, 'https', $keepAlive, $key, $keyPass, $sslVersion);
- }
-
/**
* Contributed by Justin Miller <justin@voxel.net>
* Requires curl to be built into PHP
* @param string $proxyUsername
* @param string $proxyPassword
* @param int $proxyAuthType
- * @param string $method
+ * @param string $method 'http' (let curl decide), 'http10', 'http11' or 'https'
* @param bool $keepAlive
* @param string $key
* @param string $keyPass
}
if ($port == 0) {
- if ($method == 'http') {
+ if (in_array($method, array('http', 'http10', 'http11'))) {
$port = 80;
} else {
$port = 443;
}
if (!$keepAlive || !$this->xmlrpc_curl_handle) {
- $curl = curl_init($method . '://' . $server . ':' . $port . $this->path);
+ if ($method == 'http11' || $method == 'http10') {
+ $protocol = 'http';
+ } else {
+ $protocol = $method;
+ }
+ $curl = curl_init($protocol . '://' . $server . ':' . $port . $this->path);
if ($keepAlive) {
$this->xmlrpc_curl_handle = $curl;
}
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout == 1 ? 1 : $timeout - 1);
}
+ if ($method == 'http10') {
+ curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
+ } elseif ($method == 'http11') {
+ curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
+ }
+
if ($username && $password) {
curl_setopt($curl, CURLOPT_USERPWD, $username . ':' . $password);
if (defined('CURLOPT_HTTPAUTH')) {
}
$message .= $name . ': ' . $val . "\n";
}
- $message .= "---END---";
+ $message .= '---END---';
Logger::instance()->debugMessage($message);
}