@@ -9,10 +9,16 @@ import Foundation
99
1010// MARK: - Interceptor
1111
12+ /// Interceptor merges request adaptation and retry behavior.
1213public protocol Interceptor : Adapter , Retrier { }
1314
1415// MARK: - Default interceptor
1516
17+ /// Default interceptor does not adapt (modify) requests in any way.
18+ /// Default retrying behaviour is applied as per RFC9110 specification.
19+ ///
20+ /// - warning: Retrying is currently not implemented and all requests
21+ /// are resolved as `.doNotRetry`.
1622public final class DefaultInterceptor : Interceptor {
1723
1824 public init ( ) { }
@@ -28,22 +34,42 @@ public final class DefaultInterceptor: Interceptor {
2834
2935// MARK: - Composite interceptor
3036
37+ /// Merges multiple interceptors, adapters and retriers into single interceptor instance.
38+ ///
39+ /// Adapters have priority over general interceptors and are executed first when adapting
40+ /// requests. All adapters execute in order they are passed in at initialization.
41+ ///
42+ /// Retriers have priority over general interceptors and are executed first when retrying
43+ /// requests. The first retrier to allow retrying the request is used, rest are not executed.
44+ ///
45+ /// This behaviour effectively accomplishes that request authentication is executed
46+ /// last, and requests are retried if a specific retrier allows it.
3147public final class CompositeInterceptor : Interceptor {
3248
3349 private let interceptors : [ Interceptor ]
34-
35- public init ( interceptors: [ Interceptor ] ) {
50+ private let adapters : [ Adapter ]
51+ private let retriers : [ Retrier ]
52+
53+ public init (
54+ interceptors: [ Interceptor ] ,
55+ adapters: [ Adapter ] = [ ] ,
56+ retriers: [ Retrier ] = [ ]
57+ ) {
3658 self . interceptors = interceptors
59+ self . adapters = adapters
60+ self . retriers = retriers
3761 }
3862
3963 public func adapt( urlRequest: inout URLRequest ) async throws ( NetworkError) {
40- for adapter in interceptors {
64+ let allAdapters : [ Adapter ] = adapters + interceptors
65+ for adapter in allAdapters {
4166 try await adapter. adapt ( urlRequest: & urlRequest)
4267 }
4368 }
4469
4570 public func retry( urlRequest: inout URLRequest , for session: NetworkSession , dueTo error: NetworkError ) async throws ( NetworkError) -> RetryResult {
46- for retrier in interceptors {
71+ let allRetriers : [ Retrier ] = retriers + interceptors
72+ for retrier in allRetriers {
4773 let retryResult = try await retrier. retry ( urlRequest: & urlRequest, for: session, dueTo: error)
4874 switch retryResult {
4975 case . doNotRetry:
0 commit comments