Reputation: 2157
I have such interceptor:
struct EnvInterceptor:RequestInterceptor,RequestRetrier {
let preferences = UserDefaults.standard
func adapt(_ urlRequest: URLRequest, for session: URLSession, completion: @escaping (Result<URLRequest, Error>) -> Void) {
var adaptedRequest = urlRequest
adaptedRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
guard urlRequest.url?.absoluteString.hasPrefix("/login") == true || urlRequest.url?.absoluteString.hasPrefix("/refresh") == true else {
return completion(.success(urlRequest))
}
if self.preferences.integer(forKey: "expires_in") - Int(Date().timeIntervalSince1970) - self.preferences.integer(forKey: "time_delta")<=60 {
refreshTokens()
}
adaptedRequest.addValue("Bearer " + self.preferences.string(forKey: "access_token")!, forHTTPHeaderField: "Autorization")
print("request")
completion(.success(adaptedRequest))
}
func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
}
func refreshTokens(){
print("refresh tokens")
let parameters = ["token": self.preferences.string(forKey: "refresh_token") ?? ""]
var request = URLRequest(url: URL(string: Pathes.init().refreshTokens)!)
request.httpMethod = HTTPMethod.post.rawValue
request.httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []);
AF.request(request).responseJSON() { response in
switch response.result {
case .success:
guard let data = response.data else {return}
do{
let resp = try JSONDecoder().decode(RefreshToken.self, from: data)
let dfmatter = DateFormatter()
dfmatter.dateFormat="EEE, dd MMM yyyy HH:mm:ss Z"
let date = dfmatter.date(from: response.response?.allHeaderFields["Date"] as! String)
let dateStamp:TimeInterval = date!.timeIntervalSince1970
DispatchQueue.main.async {
self.preferences.set(Int(dateStamp)-Int(Date().timeIntervalSince1970), forKey: "time_delta")
self.preferences.setValue(resp.expires_in, forKey: "expires_in")
self.preferences.setValue(resp.access_token, forKey: "access_token")
self.preferences.setValue(resp.refresh_token, forKey: "refresh_token")
}
}catch{
print(error.localizedDescription)
}
case .failure(let error):
print(error.responseCode as Any)
}
}
}
}
and here I'm trying to use it:
var request = URLRequest(Pathes.init().userInfo! as URL)
request.httpMethod = "GET"
let session = Alamofire.Session(
configuration: URLSessionConfiguration.default,
interceptor: Interceptor(adapters: [EnvInterceptor()]))
session.request(request).responseDecodable(of:PersonalInfo.self){(response) in
print(response.response?.statusCode)
}
and the problem is that I can't see response. I think that I did smth wrong during interceptor building, maybe someone will see where the problem is?
Upvotes: 0
Views: 1791
Reputation: 3885
Do you mean to use hasSuffix
in this guard
clause? Because no url string can have prefixes like "/login".
guard urlRequest.url?.absoluteString.hasPrefix("/login") == true || urlRequest.url?.absoluteString.hasPrefix("/refresh") == true else {
return completion(.success(urlRequest))
}
Upvotes: 1