@@ -155,24 +155,48 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
155
155
switch result {
156
156
case .success(let modifiedRequest):
157
157
let dataTask = urlSession.dataTaskFromProtocol(with: modifiedRequest) { data, response, error in
158
- self.cleanupRequest()
159
- if let response, let error {
160
- self.openAPIClient.interceptor.retry(urlRequest: modifiedRequest, urlSession: urlSession, requestBuilder: self, data: data, response: response, error: error) { retry in
161
- switch retry {
162
- case .retry:
163
- self.execute(completion: completion)
164
-
165
- case .dontRetry:
166
- self.openAPIClient.apiResponseQueue.async {
167
- self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
168
- }
169
- }
170
- }
171
- } else {
172
- self.openAPIClient.apiResponseQueue.async {
173
- self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion)
174
- }
158
+ self.cleanupRequest()
159
+
160
+ if let error = error {
161
+ self.retryRequest(
162
+ urlRequest: modifiedRequest,
163
+ urlSession: urlSession,
164
+ statusCode: -1,
165
+ data: data,
166
+ response: response,
167
+ error: error,
168
+ completion: completion
169
+ )
170
+ return
175
171
}
172
+
173
+ guard let httpResponse = response as? HTTPURLResponse else {
174
+ self.retryRequest(
175
+ urlRequest: modifiedRequest,
176
+ urlSession: urlSession,
177
+ statusCode: -2,
178
+ data: data,
179
+ response: response,
180
+ error: DecodableRequestBuilderError.nilHTTPResponse,
181
+ completion: completion
182
+ )
183
+ return
184
+ }
185
+
186
+ guard self.openAPIClient.successfulStatusCodeRange.contains(httpResponse.statusCode) else {
187
+ self.retryRequest(
188
+ urlRequest: modifiedRequest,
189
+ urlSession: urlSession,
190
+ statusCode: httpResponse.statusCode,
191
+ data: data,
192
+ response: httpResponse,
193
+ error: DecodableRequestBuilderError.unsuccessfulHTTPStatusCode,
194
+ completion: completion
195
+ )
196
+ return
197
+ }
198
+
199
+ self.processRequestResponse(urlRequest: request, data: data, httpResponse: httpResponse, error: error, completion: completion)
176
200
}
177
201
178
202
self.onProgressReady?(dataTask.progress)
@@ -204,22 +228,21 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
204
228
}
205
229
}
206
230
207
- fileprivate func processRequestResponse(urlRequest: URLRequest, data: Data?, response: URLResponse?, error: Error?, completion: @escaping (_ result: Swift.Result<Response <T >, ErrorResponse>) -> Void) {
231
+ private func retryRequest(urlRequest: URLRequest, urlSession: URLSessionProtocol, statusCode: Int, data: Data?, response: URLResponse?, error: Error, completion: @Sendable @escaping (_ result: Swift.Result<Response <T >, ErrorResponse>) -> Void) {
232
+ self.openAPIClient.interceptor.retry(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: response, error: error) { retry in
233
+ switch retry {
234
+ case .retry:
235
+ self.execute(completion: completion)
208
236
209
- if let error = error {
210
- completion(.failure(ErrorResponse.error(-1, data, response, error)))
211
- return
212
- }
213
-
214
- guard let httpResponse = response as? HTTPURLResponse else {
215
- completion(.failure(ErrorResponse.error(-2, data, response, DecodableRequestBuilderError.nilHTTPResponse)))
216
- return
237
+ case .dontRetry:
238
+ self.openAPIClient.apiResponseQueue.async {
239
+ completion(.failure(ErrorResponse.error(statusCode, data, response, error)))
240
+ }
241
+ }
217
242
}
243
+ }
218
244
219
- guard openAPIClient.successfulStatusCodeRange.contains(httpResponse.statusCode) else {
220
- completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, response, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode)))
221
- return
222
- }
245
+ fileprivate func processRequestResponse(urlRequest: URLRequest, data: Data?, httpResponse: HTTPURLResponse, error: Error?, completion: @escaping (_ result: Swift.Result<Response <T >, ErrorResponse>) -> Void) {
223
246
224
247
switch T.self {
225
248
case is Void.Type:
@@ -297,22 +320,7 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
297
320
}
298
321
299
322
{ {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }open{ {/nonPublicApi} } class URLSessionDecodableRequestBuilder<T: Decodable >: URLSessionRequestBuilder<T >, @unchecked Sendable {
300
- override fileprivate func processRequestResponse(urlRequest: URLRequest, data: Data?, response: URLResponse?, error: Error?, completion: @escaping (_ result: Swift.Result< Response< T> , ErrorResponse> ) -> Void) {
301
-
302
- if let error = error {
303
- completion(.failure(ErrorResponse.error(-1, data, response, error)))
304
- return
305
- }
306
-
307
- guard let httpResponse = response as? HTTPURLResponse else {
308
- completion(.failure(ErrorResponse.error(-2, data, response, DecodableRequestBuilderError.nilHTTPResponse)))
309
- return
310
- }
311
-
312
- guard openAPIClient.successfulStatusCodeRange.contains(httpResponse.statusCode) else {
313
- completion(.failure(ErrorResponse.error(httpResponse.statusCode, data, response, DecodableRequestBuilderError.unsuccessfulHTTPStatusCode)))
314
- return
315
- }
323
+ override fileprivate func processRequestResponse(urlRequest: URLRequest, data: Data?, httpResponse: HTTPURLResponse, error: Error?, completion: @escaping (_ result: Swift.Result< Response< T> , ErrorResponse> ) -> Void) {
316
324
317
325
switch T.self {
318
326
case is String.Type:
@@ -353,9 +361,9 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
353
361
completion(.success(Response(response: httpResponse, body: filePath as! T, bodyData: data)))
354
362
355
363
} catch let requestParserError as DownloadException {
356
- completion(.failure(ErrorResponse.error(400, data, response , requestParserError)))
364
+ completion(.failure(ErrorResponse.error(400, data, httpResponse , requestParserError)))
357
365
} catch {
358
- completion(.failure(ErrorResponse.error(400, data, response , error)))
366
+ completion(.failure(ErrorResponse.error(400, data, httpResponse , error)))
359
367
}
360
368
361
369
case is Void.Type:
@@ -372,7 +380,7 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
372
380
if let expressibleByNilLiteralType = T.self as? ExpressibleByNilLiteral.Type {
373
381
completion(.success(Response(response: httpResponse, body: expressibleByNilLiteralType.init(nilLiteral: ()) as! T, bodyData: data)))
374
382
} else {
375
- completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, response , DecodableRequestBuilderError.emptyDataResponse)))
383
+ completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, httpResponse , DecodableRequestBuilderError.emptyDataResponse)))
376
384
}
377
385
return
378
386
}
@@ -383,7 +391,7 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
383
391
case let .success(decodableObj):
384
392
completion(.success(Response(response: httpResponse, body: decodableObj, bodyData: unwrappedData)))
385
393
case let .failure(error):
386
- completion(.failure(ErrorResponse.error(httpResponse.statusCode, unwrappedData, response , error)))
394
+ completion(.failure(ErrorResponse.error(httpResponse.statusCode, unwrappedData, httpResponse , error)))
387
395
}
388
396
}
389
397
}
@@ -694,7 +702,7 @@ extension JSONDataEncoding: ParameterEncoding {}
694
702
{ {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } protocol OpenAPIInterceptor {
695
703
func intercept< T> (urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder< T> , completion: @escaping (Result< URLRequest, Error> ) -> Void)
696
704
697
- func retry< T> (urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder< T> , data: Data?, response: URLResponse, error: Error, completion: @escaping (OpenAPIInterceptorRetry) -> Void)
705
+ func retry< T> (urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder< T> , data: Data?, response: URLResponse? , error: Error, completion: @escaping (OpenAPIInterceptorRetry) -> Void)
698
706
}
699
707
700
708
{ {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } class DefaultOpenAPIInterceptor: OpenAPIInterceptor {
@@ -704,7 +712,7 @@ extension JSONDataEncoding: ParameterEncoding {}
704
712
completion(.success(urlRequest))
705
713
}
706
714
707
- public func retry<T >(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T >, data: Data?, response: URLResponse, error: Error, completion: @escaping (OpenAPIInterceptorRetry) -> Void) {
715
+ public func retry<T >(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T >, data: Data?, response: URLResponse? , error: Error, completion: @escaping (OpenAPIInterceptorRetry) -> Void) {
708
716
completion(.dontRetry)
709
717
}
710
718
}
0 commit comments