updated-packages
This commit is contained in:
@@ -101,7 +101,7 @@ class Curl implements HttpAdapter, StreamInterface
|
||||
* Set the configuration array for the adapter
|
||||
*
|
||||
* @param array|Traversable $options
|
||||
* @return Curl
|
||||
* @return $this
|
||||
* @throws AdapterException\InvalidArgumentException
|
||||
*/
|
||||
public function setOptions($options = [])
|
||||
@@ -143,7 +143,7 @@ class Curl implements HttpAdapter, StreamInterface
|
||||
break;
|
||||
default:
|
||||
if (is_array($v) && isset($this->config[$option]) && is_array($this->config[$option])) {
|
||||
$v = ArrayUtils::merge($this->config[$option], $v);
|
||||
$v = ArrayUtils::merge($this->config[$option], $v, true);
|
||||
}
|
||||
$this->config[$option] = $v;
|
||||
break;
|
||||
@@ -168,7 +168,7 @@ class Curl implements HttpAdapter, StreamInterface
|
||||
*
|
||||
* @param string|int $option
|
||||
* @param mixed $value
|
||||
* @return Curl
|
||||
* @return $this
|
||||
*/
|
||||
public function setCurlOption($option, $value)
|
||||
{
|
||||
@@ -208,6 +208,18 @@ class Curl implements HttpAdapter, StreamInterface
|
||||
} else {
|
||||
$connectTimeout = null;
|
||||
}
|
||||
|
||||
if ($connectTimeout !== null && ! is_numeric($connectTimeout)) {
|
||||
throw new AdapterException\InvalidArgumentException(sprintf(
|
||||
'integer or numeric string expected, got %s',
|
||||
gettype($connectTimeout)
|
||||
));
|
||||
}
|
||||
|
||||
if ($connectTimeout !== null) {
|
||||
$connectTimeout = (int) $connectTimeout;
|
||||
}
|
||||
|
||||
if ($connectTimeout !== null) {
|
||||
if (defined('CURLOPT_CONNECTTIMEOUT_MS')) {
|
||||
curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT_MS, $connectTimeout * 1000);
|
||||
@@ -413,9 +425,7 @@ class Curl implements HttpAdapter, StreamInterface
|
||||
* Make sure POSTFIELDS is set after $curlMethod is set:
|
||||
* @link http://de2.php.net/manual/en/function.curl-setopt.php#81161
|
||||
*/
|
||||
if (in_array($method, ['POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], true)) {
|
||||
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $body);
|
||||
} elseif ($curlMethod == CURLOPT_UPLOAD) {
|
||||
if ($curlMethod == CURLOPT_UPLOAD) {
|
||||
// this covers a PUT by file-handle:
|
||||
// Make the setting of this options explicit (rather than setting it through the loop following a bit lower)
|
||||
// to group common functionality together.
|
||||
@@ -423,6 +433,8 @@ class Curl implements HttpAdapter, StreamInterface
|
||||
curl_setopt($this->curl, CURLOPT_INFILESIZE, $this->config['curloptions'][CURLOPT_INFILESIZE]);
|
||||
unset($this->config['curloptions'][CURLOPT_INFILE]);
|
||||
unset($this->config['curloptions'][CURLOPT_INFILESIZE]);
|
||||
} elseif (in_array($method, ['POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], true)) {
|
||||
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $body);
|
||||
}
|
||||
|
||||
// set additional curl options
|
||||
@@ -482,7 +494,7 @@ class Curl implements HttpAdapter, StreamInterface
|
||||
|
||||
// cURL automatically handles Proxy rewrites, remove the "HTTP/1.0 200 Connection established" string:
|
||||
$responseHeaders = preg_replace(
|
||||
"/HTTP\/1.0\s*200\s*Connection\s*established\\r\\n\\r\\n/",
|
||||
"/HTTP\/1.[01]\s*200\s*Connection\s*established\\r\\n\\r\\n/",
|
||||
'',
|
||||
$responseHeaders
|
||||
);
|
||||
@@ -541,7 +553,7 @@ class Curl implements HttpAdapter, StreamInterface
|
||||
* Set output stream for the response
|
||||
*
|
||||
* @param resource $stream
|
||||
* @return Curl
|
||||
* @return $this
|
||||
*/
|
||||
public function setOutputStream($stream)
|
||||
{
|
||||
|
@@ -7,9 +7,11 @@
|
||||
|
||||
namespace Zend\Http\Client\Adapter;
|
||||
|
||||
use Traversable;
|
||||
use Zend\Http\Client;
|
||||
use Zend\Http\Client\Adapter\Exception as AdapterException;
|
||||
use Zend\Http\Response;
|
||||
use Zend\Stdlib\ArrayUtils;
|
||||
use Zend\Stdlib\ErrorHandler;
|
||||
|
||||
/**
|
||||
@@ -60,6 +62,15 @@ class Proxy extends Socket
|
||||
*/
|
||||
public function setOptions($options = [])
|
||||
{
|
||||
if ($options instanceof Traversable) {
|
||||
$options = ArrayUtils::iteratorToArray($options);
|
||||
}
|
||||
if (! is_array($options)) {
|
||||
throw new AdapterException\InvalidArgumentException(
|
||||
'Array or Zend\Config object expected, got ' . gettype($options)
|
||||
);
|
||||
}
|
||||
|
||||
//enforcing that the proxy keys are set in the form proxy_*
|
||||
foreach ($options as $k => $v) {
|
||||
if (preg_match('/^proxy[a-z]+/', $k)) {
|
||||
@@ -93,6 +104,7 @@ class Proxy extends Socket
|
||||
/* Url might require stream context even if proxy connection doesn't */
|
||||
if ($secure) {
|
||||
$this->config['sslusecontext'] = true;
|
||||
$this->setSslCryptoMethod = false;
|
||||
}
|
||||
|
||||
// Connect (a non-secure connection) to the proxy server
|
||||
@@ -129,7 +141,10 @@ class Proxy extends Socket
|
||||
$host = $this->config['proxy_host'];
|
||||
$port = $this->config['proxy_port'];
|
||||
|
||||
if ($this->connectedTo[0] != sprintf('tcp://%s', $host) || $this->connectedTo[1] != $port) {
|
||||
$isSecure = strtolower($uri->getScheme()) === 'https';
|
||||
$connectedHost = ($isSecure ? $this->config['ssltransport'] : 'tcp') . '://' . $host;
|
||||
|
||||
if ($this->connectedTo[1] !== $port || $this->connectedTo[0] !== $connectedHost) {
|
||||
throw new AdapterException\RuntimeException(
|
||||
'Trying to write but we are connected to the wrong proxy server'
|
||||
);
|
||||
@@ -145,7 +160,7 @@ class Proxy extends Socket
|
||||
}
|
||||
|
||||
// if we are proxying HTTPS, preform CONNECT handshake with the proxy
|
||||
if ($uri->getScheme() == 'https' && ! $this->negotiated) {
|
||||
if ($isSecure && ! $this->negotiated) {
|
||||
$this->connectHandshake($uri->getHost(), $uri->getPort(), $httpVer, $headers);
|
||||
$this->negotiated = true;
|
||||
}
|
||||
@@ -153,16 +168,21 @@ class Proxy extends Socket
|
||||
// Save request method for later
|
||||
$this->method = $method;
|
||||
|
||||
// Build request headers
|
||||
if ($this->negotiated) {
|
||||
$path = $uri->getPath();
|
||||
$query = $uri->getQuery();
|
||||
$path .= $query ? '?' . $query : '';
|
||||
$request = sprintf('%s %s HTTP/%s%s', $method, $path, $httpVer, "\r\n");
|
||||
} else {
|
||||
$request = sprintf('%s %s HTTP/%s%s', $method, $uri, $httpVer, "\r\n");
|
||||
if ($uri->getUserInfo()) {
|
||||
$headers['Authorization'] = 'Basic ' . base64_encode($uri->getUserInfo());
|
||||
}
|
||||
|
||||
$path = $uri->getPath();
|
||||
$query = $uri->getQuery();
|
||||
$path .= $query ? '?' . $query : '';
|
||||
|
||||
if (! $this->negotiated) {
|
||||
$path = $uri->getScheme() . '://' . $uri->getHost() . $path;
|
||||
}
|
||||
|
||||
// Build request headers
|
||||
$request = sprintf('%s %s HTTP/%s%s', $method, $path, $httpVer, "\r\n");
|
||||
|
||||
// Add all headers to the request string
|
||||
foreach ($headers as $k => $v) {
|
||||
if (is_string($k)) {
|
||||
@@ -182,7 +202,7 @@ class Proxy extends Socket
|
||||
ErrorHandler::start();
|
||||
$test = fwrite($this->socket, $request);
|
||||
$error = ErrorHandler::stop();
|
||||
if (! $test) {
|
||||
if ($test === false) {
|
||||
throw new AdapterException\RuntimeException('Error writing request to proxy server', 0, $error);
|
||||
}
|
||||
|
||||
|
@@ -86,6 +86,11 @@ class Socket implements HttpAdapter, StreamInterface
|
||||
*/
|
||||
protected $context;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
protected $setSslCryptoMethod = true;
|
||||
|
||||
/**
|
||||
* Adapter constructor, currently empty. Config is set using setOptions()
|
||||
*
|
||||
@@ -138,7 +143,7 @@ class Socket implements HttpAdapter, StreamInterface
|
||||
*
|
||||
* @param mixed $context Stream context or array of context options
|
||||
* @throws Exception\InvalidArgumentException
|
||||
* @return Socket
|
||||
* @return $this
|
||||
*/
|
||||
public function setStreamContext($context)
|
||||
{
|
||||
@@ -262,6 +267,14 @@ class Socket implements HttpAdapter, StreamInterface
|
||||
} else {
|
||||
$connectTimeout = $this->config['timeout'];
|
||||
}
|
||||
|
||||
if ($connectTimeout !== null && ! is_numeric($connectTimeout)) {
|
||||
throw new AdapterException\InvalidArgumentException(sprintf(
|
||||
'integer or numeric string expected, got %s',
|
||||
gettype($connectTimeout)
|
||||
));
|
||||
}
|
||||
|
||||
ErrorHandler::start();
|
||||
$this->socket = stream_socket_client(
|
||||
$host . ':' . $port,
|
||||
@@ -293,47 +306,52 @@ class Socket implements HttpAdapter, StreamInterface
|
||||
}
|
||||
|
||||
if ($secure || $this->config['sslusecontext']) {
|
||||
if ($this->config['ssltransport'] && isset(static::$sslCryptoTypes[$this->config['ssltransport']])) {
|
||||
$sslCryptoMethod = static::$sslCryptoTypes[$this->config['ssltransport']];
|
||||
} else {
|
||||
$sslCryptoMethod = STREAM_CRYPTO_METHOD_SSLv3_CLIENT;
|
||||
}
|
||||
if ($this->setSslCryptoMethod) {
|
||||
if ($this->config['ssltransport']
|
||||
&& isset(static::$sslCryptoTypes[$this->config['ssltransport']])
|
||||
) {
|
||||
$sslCryptoMethod = static::$sslCryptoTypes[$this->config['ssltransport']];
|
||||
} else {
|
||||
$sslCryptoMethod = STREAM_CRYPTO_METHOD_SSLv3_CLIENT;
|
||||
}
|
||||
|
||||
ErrorHandler::start();
|
||||
$test = stream_socket_enable_crypto($this->socket, true, $sslCryptoMethod);
|
||||
$error = ErrorHandler::stop();
|
||||
if (! $test || $error) {
|
||||
// Error handling is kind of difficult when it comes to SSL
|
||||
$errorString = '';
|
||||
if (extension_loaded('openssl')) {
|
||||
while (($sslError = openssl_error_string()) != false) {
|
||||
$errorString .= sprintf('; SSL error: %s', $sslError);
|
||||
ErrorHandler::start();
|
||||
$test = stream_socket_enable_crypto($this->socket, true, $sslCryptoMethod);
|
||||
$error = ErrorHandler::stop();
|
||||
if (! $test || $error) {
|
||||
// Error handling is kind of difficult when it comes to SSL
|
||||
$errorString = '';
|
||||
if (extension_loaded('openssl')) {
|
||||
while (($sslError = openssl_error_string()) != false) {
|
||||
$errorString .= sprintf('; SSL error: %s', $sslError);
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->close();
|
||||
$this->close();
|
||||
|
||||
if ((! $errorString) && $this->config['sslverifypeer']) {
|
||||
// There's good chance our error is due to sslcapath not being properly set
|
||||
if (! ($this->config['sslcafile'] || $this->config['sslcapath'])) {
|
||||
$errorString = 'make sure the "sslcafile" or "sslcapath" option are properly set for the '
|
||||
. 'environment.';
|
||||
} elseif ($this->config['sslcafile'] && ! is_file($this->config['sslcafile'])) {
|
||||
$errorString = 'make sure the "sslcafile" option points to a valid SSL certificate file';
|
||||
} elseif ($this->config['sslcapath'] && ! is_dir($this->config['sslcapath'])) {
|
||||
$errorString = 'make sure the "sslcapath" option points to a valid SSL certificate '
|
||||
. 'directory';
|
||||
if ((! $errorString) && $this->config['sslverifypeer']) {
|
||||
// There's good chance our error is due to sslcapath not being properly set
|
||||
if (! ($this->config['sslcafile'] || $this->config['sslcapath'])) {
|
||||
$errorString = 'make sure the "sslcafile" or "sslcapath" option are properly set for '
|
||||
. 'the environment.';
|
||||
} elseif ($this->config['sslcafile'] && ! is_file($this->config['sslcafile'])) {
|
||||
$errorString = 'make sure the "sslcafile" option points to a valid SSL certificate '
|
||||
. 'file';
|
||||
} elseif ($this->config['sslcapath'] && ! is_dir($this->config['sslcapath'])) {
|
||||
$errorString = 'make sure the "sslcapath" option points to a valid SSL certificate '
|
||||
. 'directory';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($errorString) {
|
||||
$errorString = sprintf(': %s', $errorString);
|
||||
}
|
||||
if ($errorString) {
|
||||
$errorString = sprintf(': %s', $errorString);
|
||||
}
|
||||
|
||||
throw new AdapterException\RuntimeException(sprintf(
|
||||
'Unable to enable crypto on TCP connection %s%s',
|
||||
$host,
|
||||
$errorString
|
||||
), 0, $error);
|
||||
throw new AdapterException\RuntimeException(sprintf(
|
||||
'Unable to enable crypto on TCP connection %s%s',
|
||||
$host,
|
||||
$errorString
|
||||
), 0, $error);
|
||||
}
|
||||
}
|
||||
|
||||
$host = $this->config['ssltransport'] . '://' . $host;
|
||||
@@ -381,7 +399,7 @@ class Socket implements HttpAdapter, StreamInterface
|
||||
$request = $method . ' ' . $path . ' HTTP/' . $httpVer . "\r\n";
|
||||
foreach ($headers as $k => $v) {
|
||||
if (is_string($k)) {
|
||||
$v = ucfirst($k) . ': ' . $v;
|
||||
$v = $k . ': ' . $v;
|
||||
}
|
||||
$request .= $v . "\r\n";
|
||||
}
|
||||
|
@@ -132,7 +132,7 @@ class Test implements AdapterInterface
|
||||
$request = $method . ' ' . $path . ' HTTP/' . $httpVer . "\r\n";
|
||||
foreach ($headers as $k => $v) {
|
||||
if (is_string($k)) {
|
||||
$v = ucfirst($k) . ': ' . $v;
|
||||
$v = $k . ': ' . $v;
|
||||
}
|
||||
$request .= $v . "\r\n";
|
||||
}
|
||||
|
Reference in New Issue
Block a user