-
-
Notifications
You must be signed in to change notification settings - Fork 6.8k
/
Copy pathBearerDecodableRequestBuilder.swift
85 lines (68 loc) · 2.78 KB
/
BearerDecodableRequestBuilder.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//
// BearerDecodableRequestBuilder.swift
// SwaggerClient
//
// Created by Bruno Coelho on 31/12/2020.
// Copyright © 2020 Swagger. All rights reserved.
//
import Foundation
import Alamofire
import PetstoreClient
class BearerRequestBuilderFactory: RequestBuilderFactory {
func getNonDecodableBuilder<T>() -> RequestBuilder<T>.Type {
BearerRequestBuilder<T>.self
}
func getBuilder<T: Decodable>() -> RequestBuilder<T>.Type {
BearerDecodableRequestBuilder<T>.self
}
}
class BearerRequestBuilder<T>: AlamofireRequestBuilder<T> {
override func createAlamofireSession(interceptor: RequestInterceptor? = nil) -> Session {
if self.requiresAuthentication {
let bearerTokenHandler = BearerTokenHandler()
let alamofireSession = super.createAlamofireSession(interceptor: bearerTokenHandler)
return alamofireSession
} else {
return super.createAlamofireSession(interceptor: nil)
}
}
}
class BearerDecodableRequestBuilder<T: Decodable>: AlamofireDecodableRequestBuilder<T> {
override func createAlamofireSession(interceptor: RequestInterceptor? = nil) -> Session {
if self.requiresAuthentication {
let bearerTokenHandler = BearerTokenHandler()
let alamofireSession = super.createAlamofireSession(interceptor: bearerTokenHandler)
return alamofireSession
} else {
return super.createAlamofireSession(interceptor: nil)
}
}
}
class BearerTokenHandler: RequestInterceptor {
private static var bearerToken: String? = nil
func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
if let bearerToken = Self.bearerToken {
var urlRequest = urlRequest
urlRequest.setValue("Bearer \(bearerToken)", forHTTPHeaderField: "Authorization")
completion(.success(urlRequest))
return
}
completion(.success(urlRequest))
}
func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 {
Self.startRefreshingToken { isTokenRefreshed in
completion(.retry)
}
} else {
completion(.doNotRetryWithError(error))
}
}
private static func startRefreshingToken(completionHandler: @escaping (Bool) -> Void) {
// Get a bearer token
let dummyBearerToken = "..."
bearerToken = dummyBearerToken
PetstoreClientAPI.customHeaders["Authorization"] = "Bearer \(dummyBearerToken)"
completionHandler(true)
}
}