in src/RetryMiddleware.php [217:276]
public function __invoke(
CommandInterface $command,
?RequestInterface $request = null
) {
$retries = 0;
$requestStats = [];
$monitoringEvents = [];
$handler = $this->nextHandler;
$decider = $this->decider;
$delay = $this->delay;
$request = $this->addRetryHeader($request, 0, 0);
$g = function ($value) use (
$handler,
$decider,
$delay,
$command,
$request,
&$retries,
&$requestStats,
&$monitoringEvents,
&$g
) {
$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($retries, $command, $request, null, $value)) {
return Promise\Create::rejectionFor(
$this->bindStatsToReturn($value, $requestStats)
);
}
} elseif ($value instanceof ResultInterface
&& !$decider($retries, $command, $request, $value, null)
) {
return $this->bindStatsToReturn($value, $requestStats);
}
// Delay fn is called with 0, 1, ... so increment after the call.
$delayBy = $delay($retries++);
$command['@http']['delay'] = $delayBy;
if ($this->collectStats) {
$this->updateStats($retries, $delayBy, $requestStats);
}
// Update retry header with retry count and delayBy
$request = $this->addRetryHeader($request, $retries, $delayBy);
return $handler($command, $request)->then($g, $g);
};
return $handler($command, $request)->then($g, $g);
}