@@ -51,10 +51,7 @@ private extension URLServer {
5151 /// Core execution method that builds the request, notifies observers, performs the network call,
5252 /// and handles errors.
5353 func execute( endpoint: Endpoint , configuring: RequestConfiguring ? ) async throws -> ExecuteResult {
54- var urlRequest = try await buildRequest ( endpoint: endpoint)
55- try await configuring? . configure ( & urlRequest)
56-
57- let observers = networkObservers. map { AnyObserverToken ( observer: $0, request: urlRequest) }
54+ let ( urlRequest, observers) = try await prepareRequest ( endpoint: endpoint, configuring: configuring)
5855
5956 let file = ( endpoint as? UploadEndpoint ) ? . file
6057
@@ -66,19 +63,43 @@ private extension URLServer {
6663 ( data, response) = try await urlSession. data ( for: urlRequest)
6764 }
6865 } catch {
69- observers. forEach { $0. didReceiveResponse ( for: urlRequest, response: nil , data: nil ) }
7066 observers. forEach { $0. didFail ( request: urlRequest, error: error) }
7167 throw error
7268 }
7369
7470 observers. forEach { $0. didReceiveResponse ( for: urlRequest, response: response, data: data) }
71+ try checkForError ( data: data, response: response, request: urlRequest, observers: observers)
72+
73+ return ExecuteResult ( data: data, request: urlRequest, observers: observers)
74+ }
75+ }
76+
77+ // MARK: - Shared helpers
7578
79+ extension URLServer {
80+
81+ /// Builds the URLRequest for the endpoint, applies optional configuration, and creates observer tokens.
82+ func prepareRequest(
83+ endpoint: Endpoint ,
84+ configuring: RequestConfiguring ?
85+ ) async throws -> ( URLRequest , [ AnyObserverToken ] ) {
86+ var urlRequest = try await buildRequest ( endpoint: endpoint)
87+ try await configuring? . configure ( & urlRequest)
88+ let observers = networkObservers. map { AnyObserverToken ( observer: $0, request: urlRequest) }
89+ return ( urlRequest, observers)
90+ }
91+
92+ /// Checks the response for API errors and notifies observers on failure.
93+ func checkForError(
94+ data: Data ? ,
95+ response: URLResponse ,
96+ request: URLRequest ,
97+ observers: [ AnyObserverToken ]
98+ ) throws {
7699 if let error = ErrorType ( data: data, response: response, error: nil , decoding: decoding) {
77- observers. forEach { $0. didFail ( request: urlRequest , error: error) }
100+ observers. forEach { $0. didFail ( request: request , error: error) }
78101 throw error
79102 }
80-
81- return ExecuteResult ( data: data, request: urlRequest, observers: observers)
82103 }
83104}
84105
0 commit comments