in aws/rust-runtime/aws-http/src/retry.rs [59:99]
fn classify(&self, err: Result<&T, &SdkError<E>>) -> RetryKind {
let (err, response) = match err {
Ok(_) => return RetryKind::NotRetryable,
Err(SdkError::ServiceError { err, raw }) => (err, raw),
Err(SdkError::DispatchFailure(err)) => {
return if err.is_timeout() || err.is_io() {
RetryKind::Error(ErrorKind::TransientError)
} else if let Some(ek) = err.is_other() {
RetryKind::Error(ek)
} else {
RetryKind::NotRetryable
}
}
Err(_) => return RetryKind::NotRetryable,
};
if let Some(retry_after_delay) = response
.http()
.headers()
.get("x-amz-retry-after")
.and_then(|header| header.to_str().ok())
.and_then(|header| header.parse::<u64>().ok())
{
return RetryKind::Explicit(Duration::from_millis(retry_after_delay));
}
if let Some(kind) = err.retryable_error_kind() {
return RetryKind::Error(kind);
};
if let Some(code) = err.code() {
if THROTTLING_ERRORS.contains(&code) {
return RetryKind::Error(ErrorKind::ThrottlingError);
}
if TRANSIENT_ERRORS.contains(&code) {
return RetryKind::Error(ErrorKind::TransientError);
}
};
if TRANSIENT_ERROR_STATUS_CODES.contains(&response.http().status().as_u16()) {
return RetryKind::Error(ErrorKind::TransientError);
};
// TODO(https://github.com/awslabs/smithy-rs/issues/966): IDPCommuncation error needs to be retried
RetryKind::NotRetryable
}