Open Journal Systems  3.3.0
RetryMiddleware.php
1 <?php
2 namespace GuzzleHttp;
3 
9 
15 {
17  private $nextHandler;
18 
20  private $decider;
21 
23  private $delay;
24 
35  public function __construct(
36  callable $decider,
37  callable $nextHandler,
38  callable $delay = null
39  ) {
40  $this->decider = $decider;
41  $this->nextHandler = $nextHandler;
42  $this->delay = $delay ?: __CLASS__ . '::exponentialDelay';
43  }
44 
52  public static function exponentialDelay($retries)
53  {
54  return (int) pow(2, $retries - 1) * 1000;
55  }
56 
63  public function __invoke(RequestInterface $request, array $options)
64  {
65  if (!isset($options['retries'])) {
66  $options['retries'] = 0;
67  }
68 
69  $fn = $this->nextHandler;
70  return $fn($request, $options)
71  ->then(
72  $this->onFulfilled($request, $options),
73  $this->onRejected($request, $options)
74  );
75  }
76 
82  private function onFulfilled(RequestInterface $req, array $options)
83  {
84  return function ($value) use ($req, $options) {
85  if (!call_user_func(
86  $this->decider,
87  $options['retries'],
88  $req,
89  $value,
90  null
91  )) {
92  return $value;
93  }
94  return $this->doRetry($req, $options, $value);
95  };
96  }
97 
103  private function onRejected(RequestInterface $req, array $options)
104  {
105  return function ($reason) use ($req, $options) {
106  if (!call_user_func(
107  $this->decider,
108  $options['retries'],
109  $req,
110  null,
111  $reason
112  )) {
113  return \GuzzleHttp\Promise\rejection_for($reason);
114  }
115  return $this->doRetry($req, $options);
116  };
117  }
118 
122  private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null)
123  {
124  $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response);
125 
126  return $this($request, $options);
127  }
128 }
GuzzleHttp
Definition: vendor/guzzlehttp/guzzle/src/Client.php:2
GuzzleHttp\Promise\PromiseInterface
Definition: PromiseInterface.php:13
Psr\Http\Message\RequestInterface
Definition: vendor/psr/http-message/src/RequestInterface.php:24
GuzzleHttp\RetryMiddleware\__construct
__construct(callable $decider, callable $nextHandler, callable $delay=null)
Definition: RetryMiddleware.php:44
GuzzleHttp\RetryMiddleware\exponentialDelay
static exponentialDelay($retries)
Definition: RetryMiddleware.php:61
GuzzleHttp\Psr7
Definition: AppendStream.php:2
Psr\Http\Message\ResponseInterface
Definition: vendor/psr/http-message/src/ResponseInterface.php:20
GuzzleHttp\RetryMiddleware
Definition: RetryMiddleware.php:14
GuzzleHttp\Promise\RejectedPromise
Definition: guzzlehttp/promises/src/RejectedPromise.php:10
GuzzleHttp\RetryMiddleware\__invoke
__invoke(RequestInterface $request, array $options)
Definition: RetryMiddleware.php:72