1
0
mirror of synced 2024-11-25 14:56:07 +03:00

Curl retry, curl timeouts & verify options

This commit is contained in:
Alex Lushpai 2015-04-30 17:35:57 +03:00
parent b4f3c0efb2
commit 03466cf0ad
3 changed files with 31 additions and 10 deletions

View File

@ -15,6 +15,7 @@ class Client
protected $url; protected $url;
protected $defaultParameters; protected $defaultParameters;
protected $retry;
public function __construct($url, array $defaultParameters = array()) public function __construct($url, array $defaultParameters = array())
{ {
@ -24,6 +25,7 @@ class Client
$this->url = $url; $this->url = $url;
$this->defaultParameters = $defaultParameters; $this->defaultParameters = $defaultParameters;
$this->retry = 0;
} }
/** /**
@ -33,9 +35,10 @@ class Client
* @param string $method (default: 'GET') * @param string $method (default: 'GET')
* @param array $parameters (default: array()) * @param array $parameters (default: array())
* @param int $timeout * @param int $timeout
* @param bool $verify
* @return ApiResponse * @return ApiResponse
*/ */
public function makeRequest($path, $method, array $parameters = array(), $timeout = 30) public function makeRequest($path, $method, array $parameters = array(), $timeout = 30, $verify=false)
{ {
$allowedMethods = array(self::METHOD_GET, self::METHOD_POST); $allowedMethods = array(self::METHOD_GET, self::METHOD_POST);
if (!in_array($method, $allowedMethods)) { if (!in_array($method, $allowedMethods)) {
@ -55,20 +58,21 @@ class Client
$ch = curl_init(); $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $path); curl_setopt($ch, CURLOPT_URL, $path);
curl_setopt($ch, CURLOPT_TIMEOUT, (int)$timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, false); curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $verify);
curl_setopt($ch, CURLOPT_TIMEOUT, (int) $timeout); // times out after 30s curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $verify);
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects
if (self::METHOD_POST === $method) { if (self::METHOD_POST === $method) {
curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters); curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
} }
$responseBody = curl_exec($ch); $responseBody = $this->curlExec($ch);
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$errno = curl_errno($ch); $errno = curl_errno($ch);
$error = curl_error($ch); $error = curl_error($ch);
curl_close($ch); curl_close($ch);
@ -79,4 +83,20 @@ class Client
return new ApiResponse($statusCode, $responseBody); return new ApiResponse($statusCode, $responseBody);
} }
/**
* @param resource $ch
* @return mixed
*/
private function curlExec($ch) {
$exec = curl_exec($ch);
if (curl_errno($ch) && in_array(curl_errno($ch), array(6, 7, 28, 34, 35)) && $this->retry < 3) {
$this->retry += 1;
$this->curlExec($ch);
}
return $exec;
}
} }

View File

@ -9,6 +9,7 @@ class ApiClientReferenceTest extends TestCase
/** /**
* @group integration * @group integration
* @dataProvider getListDictionaries * @dataProvider getListDictionaries
* @param $name
*/ */
public function testList($name) public function testList($name)
{ {

View File

@ -24,7 +24,7 @@ class ClientTest extends TestCase
*/ */
public function testHttpRequiring() public function testHttpRequiring()
{ {
$client = new Client('http://a.intarocrm.ru', array('apiKey' => '123')); $client = new Client('http://demo.intarocrm.ru/api/' . ApiClient::VERSION, array('apiKey' => '123'));
} }
/** /**
@ -33,13 +33,13 @@ class ClientTest extends TestCase
*/ */
public function testMakeRequestWrongMethod() public function testMakeRequestWrongMethod()
{ {
$client = new Client('https://asdf.df', array()); $client = new Client('https://demo.intarocrm.ru/api/' . ApiClient::VERSION, array('apiKey' => '123'));
$client->makeRequest('/a', 'adsf'); $client->makeRequest('/a', 'adsf');
} }
/** /**
* @group integration * @group integration
* @expectedException RetailCrm\Exception\CurlException * @expectedException \RetailCrm\Exception\CurlException
*/ */
public function testMakeRequestWrongUrl() public function testMakeRequestWrongUrl()
{ {