Skip to content

Commit

Permalink
Merge pull request #36 from denis-obukhov/master
Browse files Browse the repository at this point in the history
Add the ability to retry a request
  • Loading branch information
s4cha authored Oct 28, 2021
2 parents abc8c6e + f09de00 commit 8792ccd
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 12 deletions.
24 changes: 18 additions & 6 deletions Sources/Networking/Calls/NetworkingClient+Requests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,27 @@ public extension NetworkingClient {

internal func request(_ httpVerb: HTTPVerb, _ route: String, params: Params = Params()) -> NetworkingRequest {
let req = NetworkingRequest()
req.baseURL = baseURL
req.logLevels = logLevels
req.headers = headers
req.httpVerb = httpVerb
req.route = route
req.params = params
req.parameterEncoding = parameterEncoding
req.sessionConfiguration = sessionConfiguration
req.timeout = timeout

let updateRequest = { [weak req, weak self] in
guard let self = self else { return }
req?.baseURL = self.baseURL
req?.logLevels = self.logLevels
req?.headers = self.headers
req?.parameterEncoding = self.parameterEncoding
req?.sessionConfiguration = self.sessionConfiguration
req?.timeout = self.timeout
}
updateRequest()
req.requestRetrier = { [weak self] in
self?.requestRetrier?($0, $1)?
.handleEvents(receiveOutput: { _ in
updateRequest()
})
.eraseToAnyPublisher()
}
return req
}
}
4 changes: 2 additions & 2 deletions Sources/Networking/NetworkingClient.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import Foundation
import Combine

public struct NetworkingClient {

public class NetworkingClient {
/**
Instead of using the same keypath for every call eg: "collection",
this enables to use a default keypath for parsing collections.
Expand All @@ -15,6 +14,7 @@ public struct NetworkingClient {
public var parameterEncoding = ParameterEncoding.urlEncoded
public var timeout: TimeInterval?
public var sessionConfiguration = URLSessionConfiguration.default
public var requestRetrier: NetworkRequestRetrier?

/**
Prints network calls to the console.
Expand Down
28 changes: 24 additions & 4 deletions Sources/Networking/NetworkingRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import Foundation
import Combine

public typealias NetworkRequestRetrier = (_ request: URLRequest, _ error: Error) -> AnyPublisher<Void, Error>?

public class NetworkingRequest: NSObject {

var parameterEncoding = ParameterEncoding.urlEncoded
Expand All @@ -25,7 +27,9 @@ public class NetworkingRequest: NSObject {
var timeout: TimeInterval?
let progressPublisher = PassthroughSubject<Progress, Error>()
var sessionConfiguration: URLSessionConfiguration?

var requestRetrier: NetworkRequestRetrier?
private let maxRetryCount = 3

public func uploadPublisher() -> AnyPublisher<(Data?, Progress), Error> {

guard let urlRequest = buildURLRequest() else {
Expand Down Expand Up @@ -63,9 +67,12 @@ public class NetworkingRequest: NSObject {
return Publishers.Merge(callPublisher, progressPublisher2)
.receive(on: DispatchQueue.main).eraseToAnyPublisher()
}

public func publisher() -> AnyPublisher<Data, Error> {

publisher(retryCount: maxRetryCount)
}

private func publisher(retryCount: Int) -> AnyPublisher<Data, Error> {
guard let urlRequest = buildURLRequest() else {
return Fail(error: NetworkingError.unableToParseRequest as Error)
.eraseToAnyPublisher()
Expand All @@ -87,7 +94,20 @@ public class NetworkingRequest: NSObject {
}
}
return data
}.mapError { error -> NetworkingError in
}.tryCatch({ [weak self, urlRequest] error -> AnyPublisher<Data, Error> in
guard
let self = self,
retryCount > 1,
let retryPublisher = self.requestRetrier?(urlRequest, error)
else {
throw error
}
return retryPublisher
.flatMap { _ -> AnyPublisher<Data, Error> in
self.publisher(retryCount: retryCount - 1)
}
.eraseToAnyPublisher()
}).mapError { error -> NetworkingError in
return NetworkingError(error: error)
}.receive(on: DispatchQueue.main).eraseToAnyPublisher()
}
Expand Down

0 comments on commit 8792ccd

Please sign in to comment.