I implemented retry to my Alamofire request as RequestInterceptor.
I am getting the Alamofire error codes and display error messages based of error code.
But if retry fails it returns:
requestRetryFailed(retryError: Alamofire.AFError.responseValidationFailed(reason: Alamofire.AFError.ResponseValidationFailureReason.unacceptableStatusCode(code: 401)), originalError: Alamofire.AFError.responseValidationFailed(reason: Alamofire.AFError.ResponseValidationFailureReason.unacceptableStatusCode(code: 401)))
And I can not access the error code because it is nil. For the success scenario I can access the error code with:
let errorCode = error.asAFError?.responseCode
func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
guard let response = request.task?.response as? HTTPURLResponse else {
return completion(.doNotRetryWithError(error))
}
if (response.statusCode == 403 || response.statusCode == 401) && self.numberOfRetries < 1 {
self.numberOfRetries += 1
self.refreshToken(session: session, router: LoginRouter.refreshToken) {(result: Result<LoginModel, Error>) in
switch result {
case .success(let result):
self.saveRefreshToken(result)
completion(.retryWithDelay(0.3))
case .failure(let error):
completion(.doNotRetryWithError(error))
}
}
}else {
completion(.doNotRetryWithError(error))
}
}