From fae91aadc44e040dcc295e81c7f71923e6573e83 Mon Sep 17 00:00:00 2001 From: Timur Shafigullin Date: Fri, 28 Jun 2024 16:37:57 +0300 Subject: [PATCH] Added retry for API requests with time-out error (#60) --- .../HTTPService/HTTPServiceTask.swift | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/Sources/AnalyticsGenTools/HTTPService/HTTPServiceTask.swift b/Sources/AnalyticsGenTools/HTTPService/HTTPServiceTask.swift index 6e9d549..8d4292e 100644 --- a/Sources/AnalyticsGenTools/HTTPService/HTTPServiceTask.swift +++ b/Sources/AnalyticsGenTools/HTTPService/HTTPServiceTask.swift @@ -9,6 +9,7 @@ public final class HTTPServiceTask: HTTPTask { // MARK: - Instance Properties private var responseQueue: OperationQueue + private var numberOfRetries = 3 // MARK: - @@ -213,7 +214,14 @@ extension HTTPServiceTask where SessionTask == URLSessionDataTask { internal func launch() -> Self { do { sessionTask = session.dataTask(with: try route.asRequest()) { data, response, error in - self.handleResponse(response, data: data, error: error) + if let urlError = error as? URLError, urlError.code == .timedOut, self.numberOfRetries > .zero { + Log.info("Got TimeOut error. Retry \(self.numberOfRetries) time(s)...") + + self.numberOfRetries -= 1 + self.launch() + } else { + self.handleResponse(response, data: data, error: error) + } } sessionTask?.resume() @@ -233,11 +241,18 @@ extension HTTPServiceTask where SessionTask == URLSessionDownloadTask { internal func launch() -> Self { do { sessionTask = session.downloadTask(with: try route.asRequest()) { url, response, error in - self.handleResponse( - response, - data: url.flatMap { try? Data(contentsOf: $0) }, - error: error - ) + if let urlError = error as? URLError, urlError.code == .timedOut, self.numberOfRetries > .zero { + Log.info("Got TimeOut error. Retry \(self.numberOfRetries) time(s)...") + + self.numberOfRetries -= 1 + self.launch() + } else { + self.handleResponse( + response, + data: url.flatMap { try? Data(contentsOf: $0) }, + error: error + ) + } } sessionTask?.resume()