mirror of
https://github.com/php-curl-class/php-curl-class.git
synced 2026-08-30 04:01:47 +00:00
Implement Curl::setRetry()
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user