[swift6] alamofire interceptor (#19796)

* [swift6] alamofire interceptor

* [swift6] alamofire interceptor
This commit is contained in:
Bruno Coelho
2024-10-07 08:37:03 +01:00
committed by GitHub
parent 77e8346fd7
commit 39fb51062b
9 changed files with 22 additions and 52 deletions

View File

@@ -31,6 +31,7 @@ import Alamofire{{/useAlamofire}}
///
/// If a HTTP status code is outside of this range the response will be interpreted as failed.
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var successfulStatusCodeRange: Range<Int>{{#useAlamofire}}
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var interceptor: RequestInterceptor?
/// ResponseSerializer that will be used by the generator for `Data` responses
///
/// If unchanged, Alamofires default `DataResponseSerializer` will be used.
@@ -52,6 +53,7 @@ import Alamofire{{/useAlamofire}}
apiResponseQueue: DispatchQueue = .main,
codableHelper: CodableHelper = CodableHelper(),
successfulStatusCodeRange: Range<Int> = 200..<300{{#useAlamofire}},
interceptor: RequestInterceptor? = nil,
dataResponseSerializer: AnyResponseSerializer<Data> = AnyResponseSerializer(DataResponseSerializer()),
stringResponseSerializer: AnyResponseSerializer<String> = AnyResponseSerializer(StringResponseSerializer()){{/useAlamofire}}{{/useVapor}}
) {
@@ -66,6 +68,7 @@ import Alamofire{{/useAlamofire}}
self.apiResponseQueue = apiResponseQueue
self.codableHelper = codableHelper
self.successfulStatusCodeRange = successfulStatusCodeRange{{#useAlamofire}}
self.interceptor = interceptor
self.dataResponseSerializer = dataResponseSerializer
self.stringResponseSerializer = stringResponseSerializer{{/useAlamofire}}{{/useVapor}}
}

View File

@@ -36,11 +36,11 @@ fileprivate class AlamofireRequestBuilderConfiguration: @unchecked Sendable {
May be overridden by a subclass if you want to control the session
configuration.
*/
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} func createAlamofireSession(interceptor: RequestInterceptor? = nil) -> Alamofire.Session {
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} func createAlamofireSession() -> Alamofire.Session {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
return Alamofire.Session(configuration: configuration,
interceptor: interceptor)
interceptor: openAPIClient.interceptor)
}
/**

View File

@@ -22,6 +22,7 @@ open class OpenAPIClient: @unchecked Sendable {
///
/// If a HTTP status code is outside of this range the response will be interpreted as failed.
public var successfulStatusCodeRange: Range<Int>
public var interceptor: RequestInterceptor?
/// ResponseSerializer that will be used by the generator for `Data` responses
///
/// If unchanged, Alamofires default `DataResponseSerializer` will be used.
@@ -39,6 +40,7 @@ open class OpenAPIClient: @unchecked Sendable {
apiResponseQueue: DispatchQueue = .main,
codableHelper: CodableHelper = CodableHelper(),
successfulStatusCodeRange: Range<Int> = 200..<300,
interceptor: RequestInterceptor? = nil,
dataResponseSerializer: AnyResponseSerializer<Data> = AnyResponseSerializer(DataResponseSerializer()),
stringResponseSerializer: AnyResponseSerializer<String> = AnyResponseSerializer(StringResponseSerializer())
) {
@@ -49,6 +51,7 @@ open class OpenAPIClient: @unchecked Sendable {
self.apiResponseQueue = apiResponseQueue
self.codableHelper = codableHelper
self.successfulStatusCodeRange = successfulStatusCodeRange
self.interceptor = interceptor
self.dataResponseSerializer = dataResponseSerializer
self.stringResponseSerializer = stringResponseSerializer
}

View File

@@ -36,11 +36,11 @@ open class AlamofireRequestBuilder<T>: RequestBuilder<T>, @unchecked Sendable {
May be overridden by a subclass if you want to control the session
configuration.
*/
open func createAlamofireSession(interceptor: RequestInterceptor? = nil) -> Alamofire.Session {
open func createAlamofireSession() -> Alamofire.Session {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
return Alamofire.Session(configuration: configuration,
interceptor: interceptor)
interceptor: openAPIClient.interceptor)
}
/**

View File

@@ -16,7 +16,7 @@
6D4EFBB51C693BE200B96B06 /* PetAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4EFBB41C693BE200B96B06 /* PetAPITests.swift */; };
6D4EFBB71C693BED00B96B06 /* StoreAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4EFBB61C693BED00B96B06 /* StoreAPITests.swift */; };
6D4EFBB91C693BFC00B96B06 /* UserAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4EFBB81C693BFC00B96B06 /* UserAPITests.swift */; };
A5465873259E306E00C3929B /* BearerDecodableRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5465872259E306E00C3929B /* BearerDecodableRequestBuilder.swift */; };
A5465873259E306E00C3929B /* BearerTokenHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5465872259E306E00C3929B /* BearerTokenHandler.swift */; };
A5782C6D2664F91D00CAA106 /* PetstoreClient in Frameworks */ = {isa = PBXBuildFile; productRef = A5782C6C2664F91D00CAA106 /* PetstoreClient */; };
A5EA12542419387200E30FC3 /* FileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5EA12522419387100E30FC3 /* FileUtils.swift */; };
A5EA12552419387200E30FC3 /* UIImage+Extras.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5EA12532419387100E30FC3 /* UIImage+Extras.swift */; };
@@ -46,7 +46,7 @@
6D4EFBB41C693BE200B96B06 /* PetAPITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PetAPITests.swift; sourceTree = "<group>"; };
6D4EFBB61C693BED00B96B06 /* StoreAPITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreAPITests.swift; sourceTree = "<group>"; };
6D4EFBB81C693BFC00B96B06 /* UserAPITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserAPITests.swift; sourceTree = "<group>"; };
A5465872259E306E00C3929B /* BearerDecodableRequestBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BearerDecodableRequestBuilder.swift; sourceTree = "<group>"; };
A5465872259E306E00C3929B /* BearerTokenHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BearerTokenHandler.swift; sourceTree = "<group>"; };
A5EA12522419387100E30FC3 /* FileUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileUtils.swift; sourceTree = "<group>"; };
A5EA12532419387100E30FC3 /* UIImage+Extras.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImage+Extras.swift"; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -101,7 +101,7 @@
children = (
6D4EFB941C692C6300B96B06 /* AppDelegate.swift */,
6D4EFB961C692C6300B96B06 /* ViewController.swift */,
A5465872259E306E00C3929B /* BearerDecodableRequestBuilder.swift */,
A5465872259E306E00C3929B /* BearerTokenHandler.swift */,
6D4EFB981C692C6300B96B06 /* Main.storyboard */,
6D4EFB9B1C692C6300B96B06 /* Assets.xcassets */,
6D4EFB9D1C692C6300B96B06 /* LaunchScreen.storyboard */,
@@ -231,7 +231,7 @@
buildActionMask = 2147483647;
files = (
6D4EFB971C692C6300B96B06 /* ViewController.swift in Sources */,
A5465873259E306E00C3929B /* BearerDecodableRequestBuilder.swift in Sources */,
A5465873259E306E00C3929B /* BearerTokenHandler.swift in Sources */,
6D4EFB951C692C6300B96B06 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;

View File

@@ -16,9 +16,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Customize requestBuilderFactory
OpenAPIClient.shared.requestBuilderFactory = BearerRequestBuilderFactory()
OpenAPIClient.shared.interceptor = BearerTokenHandler()
return true
}

View File

@@ -1,5 +1,5 @@
//
// BearerDecodableRequestBuilder.swift
// BearerTokenHandler.swift
// SwaggerClient
//
// Created by Bruno Coelho on 31/12/2020.
@@ -10,44 +10,6 @@ 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>, @unchecked Sendable {
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>, @unchecked Sendable {
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, @unchecked Sendable {
private var bearerToken: String? = nil

View File

@@ -22,6 +22,7 @@ open class OpenAPIClient: @unchecked Sendable {
///
/// If a HTTP status code is outside of this range the response will be interpreted as failed.
public var successfulStatusCodeRange: Range<Int>
public var interceptor: RequestInterceptor?
/// ResponseSerializer that will be used by the generator for `Data` responses
///
/// If unchanged, Alamofires default `DataResponseSerializer` will be used.
@@ -39,6 +40,7 @@ open class OpenAPIClient: @unchecked Sendable {
apiResponseQueue: DispatchQueue = .main,
codableHelper: CodableHelper = CodableHelper(),
successfulStatusCodeRange: Range<Int> = 200..<300,
interceptor: RequestInterceptor? = nil,
dataResponseSerializer: AnyResponseSerializer<Data> = AnyResponseSerializer(DataResponseSerializer()),
stringResponseSerializer: AnyResponseSerializer<String> = AnyResponseSerializer(StringResponseSerializer())
) {
@@ -49,6 +51,7 @@ open class OpenAPIClient: @unchecked Sendable {
self.apiResponseQueue = apiResponseQueue
self.codableHelper = codableHelper
self.successfulStatusCodeRange = successfulStatusCodeRange
self.interceptor = interceptor
self.dataResponseSerializer = dataResponseSerializer
self.stringResponseSerializer = stringResponseSerializer
}

View File

@@ -36,11 +36,11 @@ open class AlamofireRequestBuilder<T>: RequestBuilder<T>, @unchecked Sendable {
May be overridden by a subclass if you want to control the session
configuration.
*/
open func createAlamofireSession(interceptor: RequestInterceptor? = nil) -> Alamofire.Session {
open func createAlamofireSession() -> Alamofire.Session {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = buildHeaders()
return Alamofire.Session(configuration: configuration,
interceptor: interceptor)
interceptor: openAPIClient.interceptor)
}
/**