in src/RetryMiddlewareV2.php [252:346]
private static function isRetryable(
$result,
$retryCurlErrors,
$options = []
) {
$errorCodes = self::$standardThrottlingErrors + self::$standardTransientErrors;
if (!empty($options['transient_error_codes'])
&& is_array($options['transient_error_codes'])
) {
foreach($options['transient_error_codes'] as $code) {
$errorCodes[$code] = true;
}
}
if (!empty($options['throttling_error_codes'])
&& is_array($options['throttling_error_codes'])
) {
foreach($options['throttling_error_codes'] as $code) {
$errorCodes[$code] = true;
}
}
$statusCodes = self::$standardTransientStatusCodes;
if (!empty($options['status_codes'])
&& is_array($options['status_codes'])
) {
foreach($options['status_codes'] as $code) {
$statusCodes[$code] = true;
}
}
if (!empty($options['curl_errors'])
&& is_array($options['curl_errors'])
) {
foreach($options['curl_errors'] as $code) {
$retryCurlErrors[$code] = true;
}
}
if ($result instanceof \Exception || $result instanceof \Throwable) {
$isError = true;
} else {
$isError = false;
}
if (!$isError) {
if (!isset($result['@metadata']['statusCode'])) {
return false;
}
return isset($statusCodes[$result['@metadata']['statusCode']]);
}
if (!($result instanceof AwsException)) {
return false;
}
if ($result->isConnectionError()) {
return true;
}
if (!empty($errorCodes[$result->getAwsErrorCode()])) {
return true;
}
if (!empty($statusCodes[$result->getStatusCode()])) {
return true;
}
if (count($retryCurlErrors)
&& ($previous = $result->getPrevious())
&& $previous instanceof RequestException
) {
if (method_exists($previous, 'getHandlerContext')) {
$context = $previous->getHandlerContext();
return !empty($context['errno'])
&& isset($retryCurlErrors[$context['errno']]);
}
$message = $previous->getMessage();
foreach (array_keys($retryCurlErrors) as $curlError) {
if (strpos($message, 'cURL error ' . $curlError . ':') === 0) {
return true;
}
}
}
// Check error shape for the retryable trait
if (!empty($errorShape = $result->getAwsErrorShape())) {
$definition = $errorShape->toArray();
if (!empty($definition['retryable'])) {
return true;
}
}
return false;
}