@@ -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
523549extension URLComponents {
0 commit comments