mirror of
https://github.com/php-curl-class/php-curl-class.git
synced 2026-08-31 12:43:14 +00:00
Merge pull request #468 from zachborboa/master
Implement Curl::setRetry()
This commit is contained in:
@@ -194,6 +194,7 @@ More examples are available under [/examples](https://github.com/php-curl-class/
|
||||
Curl::__construct($base_url = null)
|
||||
Curl::__destruct()
|
||||
Curl::__get($name)
|
||||
Curl::attemptRetry()
|
||||
Curl::beforeSend($callback)
|
||||
Curl::buildPostData($data)
|
||||
Curl::call()
|
||||
@@ -203,6 +204,7 @@ Curl::delete($url, $query_parameters = array(), $data = array())
|
||||
Curl::download($url, $mixed_filename)
|
||||
Curl::error($callback)
|
||||
Curl::exec($ch = null)
|
||||
Curl::execDone()
|
||||
Curl::get($url, $data = array())
|
||||
Curl::getCookie($key)
|
||||
Curl::getInfo($opt = null)
|
||||
@@ -238,6 +240,7 @@ Curl::setOpts($options)
|
||||
Curl::setPort($port)
|
||||
Curl::setReferer($referer)
|
||||
Curl::setReferrer($referrer)
|
||||
Curl::setRetry($mixed)
|
||||
Curl::setTimeout($seconds)
|
||||
Curl::setUrl($url, $mixed_data = '')
|
||||
Curl::setUserAgent($user_agent)
|
||||
@@ -280,6 +283,7 @@ MultiCurl::setOpts($options)
|
||||
MultiCurl::setPort($port)
|
||||
MultiCurl::setReferer($referer)
|
||||
MultiCurl::setReferrer($referrer)
|
||||
MultiCurl::setRetry($mixed)
|
||||
MultiCurl::setTimeout($seconds)
|
||||
MultiCurl::setUrl($url)
|
||||
MultiCurl::setUserAgent($user_agent)
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
|
||||
use \Curl\Curl;
|
||||
|
||||
$curl = new Curl();
|
||||
$curl->setRetry(function ($instance) {
|
||||
return $instance->retries < 3;
|
||||
});
|
||||
$curl->get('https://httpbin.org/status/503');
|
||||
|
||||
if ($curl->error) {
|
||||
echo 'Error: ' . $curl->errorCode . ': ' . $curl->errorMessage . "\n";
|
||||
echo 'attempts: ' . $curl->attempts . "\n";
|
||||
echo 'retries: ' . $curl->retries . "\n";
|
||||
} else {
|
||||
echo 'Response:' . "\n";
|
||||
var_dump($curl->response);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
|
||||
use \Curl\Curl;
|
||||
|
||||
$max_retries = 3;
|
||||
|
||||
$curl = new Curl();
|
||||
$curl->setRetry($max_retries);
|
||||
$curl->get('https://httpbin.org/status/503');
|
||||
|
||||
if ($curl->error) {
|
||||
echo 'Error: ' . $curl->errorCode . ': ' . $curl->errorMessage . "\n";
|
||||
echo 'attempts: ' . $curl->attempts . "\n";
|
||||
echo 'retries: ' . $curl->retries . "\n";
|
||||
} else {
|
||||
echo 'Response:' . "\n";
|
||||
var_dump($curl->response);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
|
||||
use \Curl\MultiCurl;
|
||||
|
||||
$multi_curl = new MultiCurl();
|
||||
$multi_curl->setRetry(function ($instance) {
|
||||
return $instance->retries < 3;
|
||||
});
|
||||
$multi_curl->complete(function ($instance) {
|
||||
echo 'call to "' . $instance->url . '" completed.' . "\n";
|
||||
echo 'attempts: ' . $instance->attempts . "\n";
|
||||
echo 'retries: ' . $instance->retries . "\n";
|
||||
});
|
||||
|
||||
$multi_curl->addGet('https://httpbin.org/status/503?a');
|
||||
$multi_curl->addGet('https://httpbin.org/status/503?b');
|
||||
$multi_curl->addGet('https://httpbin.org/status/503?c');
|
||||
|
||||
$multi_curl->start();
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
|
||||
use \Curl\MultiCurl;
|
||||
|
||||
$max_retries = 3;
|
||||
|
||||
$multi_curl = new MultiCurl();
|
||||
$multi_curl->setRetry($max_retries);
|
||||
$multi_curl->complete(function ($instance) {
|
||||
echo 'call to "' . $instance->url . '" completed.' . "\n";
|
||||
echo 'attempts: ' . $instance->attempts . "\n";
|
||||
echo 'retries: ' . $instance->retries . "\n";
|
||||
});
|
||||
|
||||
$multi_curl->addGet('https://httpbin.org/status/503?a');
|
||||
$multi_curl->addGet('https://httpbin.org/status/503?b');
|
||||
$multi_curl->addGet('https://httpbin.org/status/503?c');
|
||||
|
||||
$multi_curl->start();
|
||||
+68
-2
@@ -41,6 +41,12 @@ class Curl
|
||||
public $completeFunction = null;
|
||||
public $fileHandle = null;
|
||||
|
||||
public $attempts = 0;
|
||||
public $retries = 0;
|
||||
public $isChildOfMultiCurl = false;
|
||||
public $remainingRetries = 0;
|
||||
public $retryDecider = null;
|
||||
|
||||
private $cookies = array();
|
||||
private $headers = array();
|
||||
private $options = array();
|
||||
@@ -335,6 +341,8 @@ class Curl
|
||||
*/
|
||||
public function exec($ch = null)
|
||||
{
|
||||
$this->attempts += 1;
|
||||
|
||||
if ($ch === null) {
|
||||
$this->responseCookies = array();
|
||||
$this->call($this->beforeSendFunction);
|
||||
@@ -382,6 +390,22 @@ class Curl
|
||||
}
|
||||
$this->errorMessage = $this->curlError ? $this->curlErrorMessage : $this->httpErrorMessage;
|
||||
|
||||
// Allow multicurl to attempt retry as needed.
|
||||
if ($this->isChildOfMultiCurl) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->attemptRetry()) {
|
||||
return $this->exec($ch);
|
||||
}
|
||||
|
||||
$this->execDone();
|
||||
|
||||
return $this->response;
|
||||
}
|
||||
|
||||
public function execDone()
|
||||
{
|
||||
if ($this->error) {
|
||||
$this->call($this->errorFunction);
|
||||
} else {
|
||||
@@ -394,8 +418,6 @@ class Curl
|
||||
if (!($this->fileHandle === null)) {
|
||||
$this->downloadComplete($this->fileHandle);
|
||||
}
|
||||
|
||||
return $this->response;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1010,6 +1032,25 @@ class Curl
|
||||
$this->setOpt(CURLOPT_REFERER, $referrer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Retry
|
||||
*
|
||||
* Number of retries to attempt or decider callable. Maximum number of
|
||||
* attempts is $maximum_number_of_retries + 1.
|
||||
*
|
||||
* @access public
|
||||
* @param $mixed
|
||||
*/
|
||||
public function setRetry($mixed)
|
||||
{
|
||||
if (is_callable($mixed)) {
|
||||
$this->retryDecider = $mixed;
|
||||
} elseif (is_int($mixed)) {
|
||||
$maximum_number_of_retries = $mixed;
|
||||
$this->remainingRetries = $maximum_number_of_retries;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Timeout
|
||||
*
|
||||
@@ -1046,6 +1087,31 @@ class Curl
|
||||
$this->setOpt(CURLOPT_USERAGENT, $user_agent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt Retry
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
public function attemptRetry()
|
||||
{
|
||||
$attempt_retry = false;
|
||||
if ($this->error) {
|
||||
if ($this->retryDecider === null) {
|
||||
$attempt_retry = $this->remainingRetries >= 1;
|
||||
} else {
|
||||
$func = $this->retryDecider;
|
||||
$attempt_retry = $func($this);
|
||||
}
|
||||
if ($attempt_retry) {
|
||||
$this->retries += 1;
|
||||
if ($this->remainingRetries) {
|
||||
$this->remainingRetries -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $attempt_retry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Success
|
||||
*
|
||||
|
||||
+41
-9
@@ -18,6 +18,8 @@ class MultiCurl
|
||||
private $errorFunction = null;
|
||||
private $completeFunction = null;
|
||||
|
||||
private $retry = null;
|
||||
|
||||
private $cookies = array();
|
||||
private $headers = array();
|
||||
private $options = array();
|
||||
@@ -587,6 +589,20 @@ class MultiCurl
|
||||
$this->setOpt(CURLOPT_REFERER, $referrer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Retry
|
||||
*
|
||||
* Number of retries to attempt or decider callable. Maximum number of
|
||||
* attempts is $maximum_number_of_retries + 1.
|
||||
*
|
||||
* @access public
|
||||
* @param $mixed
|
||||
*/
|
||||
public function setRetry($mixed)
|
||||
{
|
||||
$this->retry = $mixed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Timeout
|
||||
*
|
||||
@@ -661,17 +677,31 @@ class MultiCurl
|
||||
$ch->curlErrorCode = $info_array['result'];
|
||||
$ch->exec($ch->curl);
|
||||
|
||||
// Remove completed instance from active curls.
|
||||
unset($this->activeCurls[$key]);
|
||||
if ($ch->attemptRetry()) {
|
||||
// Remove completed handle before adding again in order to retry request.
|
||||
curl_multi_remove_handle($this->multiCurl, $ch->curl);
|
||||
|
||||
// Start a new request before removing the handle of the completed one.
|
||||
if (count($this->curls) >= 1) {
|
||||
$this->initHandle(array_shift($this->curls));
|
||||
$curlm_error_code = curl_multi_add_handle($this->multiCurl, $ch->curl);
|
||||
if (!($curlm_error_code === CURLM_OK)) {
|
||||
throw new \ErrorException(
|
||||
'cURL multi add handle error: ' . curl_multi_strerror($curlm_error_code)
|
||||
);
|
||||
}
|
||||
} else {
|
||||
$ch->execDone();
|
||||
|
||||
// Remove completed instance from active curls.
|
||||
unset($this->activeCurls[$key]);
|
||||
|
||||
// Start a new request before removing the handle of the completed one.
|
||||
if (count($this->curls) >= 1) {
|
||||
$this->initHandle(array_shift($this->curls));
|
||||
}
|
||||
curl_multi_remove_handle($this->multiCurl, $ch->curl);
|
||||
|
||||
// Clean up completed instance.
|
||||
$ch->close();
|
||||
}
|
||||
curl_multi_remove_handle($this->multiCurl, $ch->curl);
|
||||
|
||||
// Clean up completed instance.
|
||||
$ch->close();
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -763,6 +793,7 @@ class MultiCurl
|
||||
{
|
||||
// Use sequential ids to allow for ordered post processing.
|
||||
$curl->id = $this->nextCurlId++;
|
||||
$curl->isChildOfMultiCurl = true;
|
||||
$this->curls[$curl->id] = $curl;
|
||||
}
|
||||
|
||||
@@ -791,6 +822,7 @@ class MultiCurl
|
||||
|
||||
$curl->setOpts($this->options);
|
||||
$curl->setHeaders($this->headers);
|
||||
$curl->setRetry($this->retry);
|
||||
|
||||
foreach ($this->cookies as $key => $value) {
|
||||
$curl->setCookie($key, $value);
|
||||
|
||||
@@ -3247,4 +3247,155 @@ 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,
|
||||
),
|
||||
array(
|
||||
'maximum_number_of_retries' => 3,
|
||||
'failures' => 3,
|
||||
'expect_success' => true,
|
||||
'expect_attempts' => 4,
|
||||
'expect_retries' => 3,
|
||||
),
|
||||
);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public function testRetryCallable()
|
||||
{
|
||||
$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,
|
||||
),
|
||||
array(
|
||||
'maximum_number_of_retries' => 3,
|
||||
'failures' => 3,
|
||||
'expect_success' => true,
|
||||
'expect_attempts' => 4,
|
||||
'expect_retries' => 3,
|
||||
),
|
||||
);
|
||||
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(function ($instance) use ($maximum_number_of_retries) {
|
||||
$return = $instance->retries < $maximum_number_of_retries;
|
||||
return $return;
|
||||
});
|
||||
}
|
||||
|
||||
$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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2590,4 +2590,161 @@ class MultiCurlTest extends \PHPUnit\Framework\TestCase
|
||||
|
||||
$multi_curl->start();
|
||||
}
|
||||
|
||||
public function testRetryMulti()
|
||||
{
|
||||
$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,
|
||||
),
|
||||
array(
|
||||
'maximum_number_of_retries' => 3,
|
||||
'failures' => 3,
|
||||
'expect_success' => true,
|
||||
'expect_attempts' => 4,
|
||||
'expect_retries' => 3,
|
||||
),
|
||||
);
|
||||
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'];
|
||||
|
||||
$multi_curl = new MultiCurl();
|
||||
$multi_curl->setOpt(CURLOPT_COOKIEJAR, '/dev/null');
|
||||
$multi_curl->setHeader('X-DEBUG-TEST', 'retry');
|
||||
|
||||
if (!($maximum_number_of_retries === null)) {
|
||||
$multi_curl->setRetry($maximum_number_of_retries);
|
||||
}
|
||||
|
||||
$instance = $multi_curl->addGet(Test::TEST_URL, array('failures' => $failures));
|
||||
$multi_curl->start();
|
||||
|
||||
$this->assertEquals($expect_success, !$instance->error);
|
||||
$this->assertEquals($expect_attempts, $instance->attempts);
|
||||
$this->assertEquals($expect_retries, $instance->retries);
|
||||
}
|
||||
}
|
||||
|
||||
public function testRetryCallableMulti()
|
||||
{
|
||||
$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,
|
||||
),
|
||||
array(
|
||||
'maximum_number_of_retries' => 3,
|
||||
'failures' => 3,
|
||||
'expect_success' => true,
|
||||
'expect_attempts' => 4,
|
||||
'expect_retries' => 3,
|
||||
),
|
||||
);
|
||||
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'];
|
||||
|
||||
$multi_curl = new MultiCurl();
|
||||
$multi_curl->setOpt(CURLOPT_COOKIEJAR, '/dev/null');
|
||||
$multi_curl->setHeader('X-DEBUG-TEST', 'retry');
|
||||
|
||||
if (!($maximum_number_of_retries === null)) {
|
||||
$multi_curl->setRetry(function ($instance) use ($maximum_number_of_retries) {
|
||||
$return = $instance->retries < $maximum_number_of_retries;
|
||||
return $return;
|
||||
});
|
||||
}
|
||||
|
||||
$instance = $multi_curl->addGet(Test::TEST_URL, array('failures' => $failures));
|
||||
$multi_curl->start();
|
||||
|
||||
$this->assertEquals($expect_success, !$instance->error);
|
||||
$this->assertEquals($expect_attempts, $instance->attempts);
|
||||
$this->assertEquals($expect_retries, $instance->retries);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ $key = isset($data_values['key']) ? $data_values['key'] : '';
|
||||
if ($test === 'http_basic_auth') {
|
||||
if (!isset($_SERVER['PHP_AUTH_USER'])) {
|
||||
header('WWW-Authenticate: Basic realm="My Realm"');
|
||||
header('HTTP/1.0 401 Unauthorized');
|
||||
header('HTTP/1.1 401 Unauthorized');
|
||||
echo 'canceled';
|
||||
exit;
|
||||
}
|
||||
@@ -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