func tryRequest()

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
        }
    }