Implement Curl::setRetry()

This commit is contained in:
Zach Borboa
2017-08-30 01:36:13 -07:00
parent 20d718e97e
commit 3c3741f891
4 changed files with 118 additions and 0 deletions
+1
View File
@@ -238,6 +238,7 @@ Curl::setOpts($options)
Curl::setPort($port)
Curl::setReferer($referer)
Curl::setReferrer($referrer)
Curl::setRetry($maximum_number_of_retries = 0)
Curl::setTimeout($seconds)
Curl::setUrl($url, $mixed_data = '')
Curl::setUserAgent($user_agent)
+27
View File
@@ -41,6 +41,11 @@ class Curl
public $completeFunction = null;
public $fileHandle = null;
public $attempts = 0;
public $retries = 0;
private $maximumNumberOfRetries = 0;
private $remainingRetries = 0;
private $cookies = array();
private $headers = array();
private $options = array();
@@ -335,6 +340,8 @@ class Curl
*/
public function exec($ch = null)
{
$this->attempts += 1;
if ($ch === null) {
$this->responseCookies = array();
$this->call($this->beforeSendFunction);
@@ -382,6 +389,12 @@ class Curl
}
$this->errorMessage = $this->curlError ? $this->curlErrorMessage : $this->httpErrorMessage;
if ($this->error && $this->remainingRetries >= 1) {
$this->remainingRetries -= 1;
$this->retries += 1;
return $this->exec($ch);
}
if ($this->error) {
$this->call($this->errorFunction);
} else {
@@ -1010,6 +1023,20 @@ class Curl
$this->setOpt(CURLOPT_REFERER, $referrer);
}
/**
* Set Retry
*
* Number of retries to attempt. Maximum number of attempts is $maximum_number_of_retries + 1.
*
* @access public
* @param $maximum_number_of_retries
*/
public function setRetry($maximum_number_of_retries = 0)
{
$this->maximumNumberOfRetries = $maximum_number_of_retries;
$this->remainingRetries = $this->maximumNumberOfRetries;
}
/**
* Set Timeout
*
+67
View File
@@ -3247,4 +3247,71 @@ class CurlTest extends \PHPUnit\Framework\TestCase
$this->assertArrayHasKey($key, $info);
}
}
public function testRetry()
{
$tests = array(
array(
'maximum_number_of_retries' => null,
'failures' => 0,
'expect_success' => true,
'expect_attempts' => 1,
'expect_retries' => 0,
),
array(
'maximum_number_of_retries' => 0,
'failures' => 0,
'expect_success' => true,
'expect_attempts' => 1,
'expect_retries' => 0,
),
array(
'maximum_number_of_retries' => 0,
'failures' => 1,
'expect_success' => false,
'expect_attempts' => 1,
'expect_retries' => 0,
),
array(
'maximum_number_of_retries' => 1,
'failures' => 1,
'expect_success' => true,
'expect_attempts' => 2,
'expect_retries' => 1,
),
array(
'maximum_number_of_retries' => 1,
'failures' => 2,
'expect_success' => false,
'expect_attempts' => 2,
'expect_retries' => 1,
),
array(
'maximum_number_of_retries' => 2,
'failures' => 2,
'expect_success' => true,
'expect_attempts' => 3,
'expect_retries' => 2,
),
);
foreach ($tests as $test) {
$maximum_number_of_retries = $test['maximum_number_of_retries'];
$failures = $test['failures'];
$expect_success = $test['expect_success'];
$expect_attempts = $test['expect_attempts'];
$expect_retries = $test['expect_retries'];
$test = new Test();
$test->curl->setOpt(CURLOPT_COOKIEJAR, '/dev/null');
if (!($maximum_number_of_retries === null)) {
$test->curl->setRetry($maximum_number_of_retries);
}
$test->server('retry', 'GET', array('failures' => $failures));
$this->assertEquals($expect_success, !$test->curl->error);
$this->assertEquals($expect_attempts, $test->curl->attempts);
$this->assertEquals($expect_retries, $test->curl->retries);
}
}
}
+23
View File
@@ -322,6 +322,29 @@ if ($test === 'http_basic_auth') {
}
}
exit;
} elseif ($test === 'retry') {
session_start();
if (isset($_SESSION['failures_remaining'])) {
$failures_remaining = $_SESSION['failures_remaining'];
} else {
$failures_remaining = ((int)$_GET['failures']);
$_SESSION['failures_remaining'] = $failures_remaining;
}
if ($failures_remaining >= 1) {
$_SESSION['failures_remaining'] -= 1;
header('HTTP/1.1 503 Service Unavailable');
echo 'Service Unavailable';
echo ' (remaining failures: ' . $_SESSION['failures_remaining'] . ')';
exit;
}
header('HTTP/1.1 202 Accepted');
echo '202 Accepted';
echo ' (remaining failures: ' . $_SESSION['failures_remaining'] . ')';
exit;
}