in src/RetryMiddlewareV2.php [167:238]
public function __invoke(CommandInterface $cmd, RequestInterface $req)
{
$decider = $this->decider;
$delayer = $this->delayer;
$handler = $this->nextHandler;
$attempts = 1;
$monitoringEvents = [];
$requestStats = [];
$req = $this->addRetryHeader($req, 0, 0);
$callback = function ($value) use (
$handler,
$cmd,
$req,
$decider,
$delayer,
&$attempts,
&$requestStats,
&$monitoringEvents,
&$callback
) {
if ($this->mode === 'adaptive') {
$this->rateLimiter->updateSendingRate($this->isThrottlingError($value));
}
$this->updateHttpStats($value, $requestStats);
if ($value instanceof MonitoringEventsInterface) {
$reversedEvents = array_reverse($monitoringEvents);
$monitoringEvents = array_merge($monitoringEvents, $value->getMonitoringEvents());
foreach ($reversedEvents as $event) {
$value->prependMonitoringEvent($event);
}
}
if ($value instanceof \Exception || $value instanceof \Throwable) {
if (!$decider($attempts, $cmd, $value)) {
return Promise\Create::rejectionFor(
$this->bindStatsToReturn($value, $requestStats)
);
}
} elseif ($value instanceof ResultInterface
&& !$decider($attempts, $cmd, $value)
) {
return $this->bindStatsToReturn($value, $requestStats);
}
$delayBy = $delayer($attempts++);
$cmd['@http']['delay'] = $delayBy;
if ($this->collectStats) {
$this->updateStats($attempts - 1, $delayBy, $requestStats);
}
// Update retry header with retry count and delayBy
$req = $this->addRetryHeader($req, $attempts - 1, $delayBy);
// Get token from rate limiter, which will sleep if necessary
if ($this->mode === 'adaptive') {
$this->rateLimiter->getSendToken();
}
return $handler($cmd, $req)->then($callback, $callback);
};
// Get token from rate limiter, which will sleep if necessary
if ($this->mode === 'adaptive') {
$this->rateLimiter->getSendToken();
}
return $handler($cmd, $req)->then($callback, $callback);
}