Andrew
Andrew

Reputation: 2157

Why I can't use my request adapter interceptor with Alamofire request?

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

Answers (1)

wzso
wzso

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

Related Questions