diff options
| author | Loic GUEGAN <loic@Manzerbredes> | 2016-01-23 14:37:24 +0100 |
|---|---|---|
| committer | Loic GUEGAN <loic@Manzerbredes> | 2016-01-23 14:37:24 +0100 |
| commit | 189f7a9ef4c6265dbac232e5c5685aebbbfc7c53 (patch) | |
| tree | d397facc1e45cee4713ea95b0eaa4ffa9cbf0921 /server/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php | |
| parent | 2984adf171c49940e683fa997e8cdc60fcf1d60b (diff) | |
| parent | a44cc1d2e3c0f147e91a5c052ac7fd879e34e706 (diff) | |
Merge branch 'develop' of github.com:manzerbredes/istic-openstack into develop
Diffstat (limited to 'server/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php')
| -rw-r--r-- | server/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/server/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php b/server/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php new file mode 100644 index 0000000..4b95a14 --- /dev/null +++ b/server/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php @@ -0,0 +1,111 @@ +<?php +namespace GuzzleHttp; + +use GuzzleHttp\Promise\PromiseInterface; +use GuzzleHttp\Promise\RejectedPromise; +use GuzzleHttp\Psr7; +use Psr\Http\Message\RequestInterface; + +/** + * Middleware that retries requests based on the boolean result of + * invoking the provided "decider" function. + */ +class RetryMiddleware +{ + /** @var callable */ + private $nextHandler; + + /** @var callable */ + private $decider; + + /** + * @param callable $decider Function that accepts the number of retries, + * a request, [response], and [exception] and + * returns true if the request is to be + * retried. + * @param callable $nextHandler Next handler to invoke. + * @param callable $delay Function that accepts the number of retries + * and returns the number of milliseconds to + * delay. + */ + public function __construct( + callable $decider, + callable $nextHandler, + callable $delay = null + ) { + $this->decider = $decider; + $this->nextHandler = $nextHandler; + $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; + } + + /** + * Default exponential backoff delay function. + * + * @param $retries + * + * @return int + */ + public static function exponentialDelay($retries) + { + return (int) pow(2, $retries - 1); + } + + /** + * @param RequestInterface $request + * @param array $options + * + * @return PromiseInterface + */ + public function __invoke(RequestInterface $request, array $options) + { + if (!isset($options['retries'])) { + $options['retries'] = 0; + } + + $fn = $this->nextHandler; + return $fn($request, $options) + ->then( + $this->onFulfilled($request, $options), + $this->onRejected($request, $options) + ); + } + + private function onFulfilled(RequestInterface $req, array $options) + { + return function ($value) use ($req, $options) { + if (!call_user_func( + $this->decider, + $options['retries'], + $req, + $value, + null + )) { + return $value; + } + return $this->doRetry($req, $options); + }; + } + + private function onRejected(RequestInterface $req, array $options) + { + return function ($reason) use ($req, $options) { + if (!call_user_func( + $this->decider, + $options['retries'], + $req, + null, + $reason + )) { + return new RejectedPromise($reason); + } + return $this->doRetry($req, $options); + }; + } + + private function doRetry(RequestInterface $request, array $options) + { + $options['delay'] = call_user_func($this->delay, ++$options['retries']); + + return $this($request, $options); + } +} |
