Reputation: 1312
Adding to my litany of Alamofire SO posts this week, why doesnt my RequestInterceptor work? Nothing inside of the adapt function gets called however a breakpoint outside of either function is hit.
Im starting to believe its not specifically the RequestInterceptor itself since I have copied a few different guides to see if it would break inside the functions and they do not. https://www.avanderlee.com/swift/authentication-alamofire-request-adapter/ https://www.raywenderlich.com/11668143-alamofire-tutorial-for-ios-advanced-usage#toc-anchor-013 https://medium.com/swlh/retry-request-using-alamofire-52c7dcd72175
finally landed here and followed a few options there which have not helped the issue either. https://github.com/Alamofire/Alamofire/issues/2998
Here is my interceptor
import Alamofire
class APIRequestInterceptor: RequestInterceptor {
typealias AdapterResult = Swift.Result<URLRequest, Error>
let retryLimit = 5
let retryDelay: TimeInterval = 10
// func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Swift.Result<URLRequest, Error>) -> Void) {
func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (AdapterResult) -> Void) {
// func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
// func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, AFError>) -> Void) {
var urlRequest = urlRequest
debugPrint("In the request interceptor...")
debugPrint(urlRequest)
if let token = Globals.sharedInstance.token {
urlRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
}
completion(.success(urlRequest))
}
func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
let response = request.task?.response as? HTTPURLResponse
//Retry for 5xx status codes
if
let statusCode = response?.statusCode,
(500...599).contains(statusCode),
request.retryCount < retryLimit {
completion(.retryWithDelay(retryDelay))
} else {
return completion(.doNotRetry)
}
}
}
and my client creating the session
static let sessionManager: Session = {
let configuration = URLSessionConfiguration.af.default
configuration.timeoutIntervalForRequest = 30
configuration.waitsForConnectivity = true
return Session(configuration: configuration, interceptor: APIRequestInterceptor(), eventMonitors: [APILogger()])
}()
and to be thorough, the requests are being made using sessionManager.request(convertible: URLRequestConvertible)
Looking at the request function, not sure why an interceptor is defined again in the request parameters?
open func request(_ convertible: URLRequestConvertible, interceptor: RequestInterceptor? = nil) -> DataRequest {}
nevertheless I also tried defining it again in the request params without any luck. sessionManager.request(route, interceptor: APIRequestInterceptor())
Upvotes: 3
Views: 5750
Reputation: 1312
It turns out that the issue was in fact disambiguation but I feel in a less than obvious way.
Looking at this issue for Alamofire https://github.com/Alamofire/Alamofire/issues/2998
disambiguating Result<URLRequest, Error> was the solution due to a custom Result type. It took some time to notice that I had a custom Error type...
My solution is to strongly disambiguate both function calls to prevent this in the future.
func adapt(_ urlRequest: URLRequest, for session: Alamofire.Session, completion: @escaping (Swift.Result<URLRequest, Swift.Error>) -> Void) {}
func retry(_ request: Alamofire.Request, for session: Alamofire.Session, dueTo error: Swift.Error, completion: @escaping (RetryResult) -> Void) {}
Upvotes: 3