in AWSClientRuntime/Sources/Middlewares/RetryerMiddleware.swift [43:72]
func tryRequest<H>(token: RetryToken,
errorType: RetryError? = nil,
partitionId: String,
context: Context,
input: SdkHttpRequestBuilder,
next: H) throws -> Result<OperationOutput<Output>, SdkError<OutputError>>
where H: Handler,
Self.MInput == H.Input,
Self.MOutput == H.Output,
Self.Context == H.Context,
Self.MError == H.MiddlewareError {
defer { retryer.releaseToken(token: token)}
let serviceResponse = next.handle(context: context, input: input)
switch serviceResponse {
case .failure(let error):
if retryer.isErrorRetryable(error: error) {
let errorType = retryer.getErrorType(error: error)
let newToken = try retryer.scheduleRetry(token: token, error: errorType)
// TODO: rewind the stream once streaming is properly implemented
return try tryRequest(token: newToken, partitionId: partitionId, context: context, input: input, next: next)
} else {
return serviceResponse
}
case .success:
retryer.recordSuccess(token: token)
return serviceResponse
}
}