Skip to content

Commit e6dd54e

Browse files
author
Fabrizio Scarano
committed
feat: Implemented customizable implementation of URLSession.dataTask in a given HTTPRequest
1 parent 8f1ea50 commit e6dd54e

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

Sources/RealHTTP/Client/HTTPRequest/HTTPRequest.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,13 @@ public class HTTPRequest: CustomStringConvertible {
170170
/// running in a specified `HTTPClient` instance.
171171
public var urlRequestModifier: RequestModifier?
172172

173+
/// Defines a default or custom implementation of `URLSession.dataTask(with:)` to execute
174+
/// when using a `.default` transfer mode.
175+
///
176+
/// Unless set with a custom implementation (using `.modified(DataTask)` enum case), the request
177+
/// executes on the default implementation.
178+
public var dataTaskModifier: DataTaskModifier = .default
179+
173180
// MARK: - Private Properties
174181

175182
/// Current network attempt. Use `maxRetries` to set the number of attempts
@@ -429,7 +436,7 @@ extension HTTPRequest {
429436
} else {
430437
switch transferMode {
431438
case .default:
432-
task = client.session.dataTask(with: urlRequest)
439+
task = dataTaskModifier.dataTask(with: urlRequest, on: client.session)
433440
case .largeData:
434441
if let partialData = partialData {
435442
task = client.session.downloadTask(withResumeData: partialData)
@@ -518,6 +525,25 @@ extension HTTPRequest {
518525
case largeData
519526
}
520527

528+
/// Defines a default or custom implementation of `URLSession.dataTask(with:)`.
529+
///
530+
/// - `default`: Uses the default `URLSession.dataTask(with:)` implementation.
531+
/// - `modifier`: Uses the custom implementation given in its associated value.
532+
public enum DataTaskModifier {
533+
public typealias DataTask = (URLRequest, URLSession) -> URLSessionDataTask
534+
535+
case `default`
536+
case modifier(DataTask)
537+
538+
public func dataTask(with urlRequest: URLRequest, on session: URLSession) -> URLSessionDataTask {
539+
switch self {
540+
case .default:
541+
session.dataTask(with: urlRequest)
542+
case .modifier(let dataTask):
543+
dataTask(urlRequest, session)
544+
}
545+
}
546+
}
521547
}
522548

523549
extension URLComponents {

0 commit comments

Comments
 (0)