Skip to content

Commit d74608e

Browse files
committed
Fix URLSessionTransport to work with multiple tasks in-flight
1 parent 003bb94 commit d74608e

File tree

1 file changed

+6
-27
lines changed

1 file changed

+6
-27
lines changed

Sources/StructuredAPIClient/Transport/URLSessionTransport.swift

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,8 @@ public final class URLSessionTransport: Transport {
2525
// See `Transport.next`.
2626
public var next: (any Transport)? { nil }
2727

28-
private final class LockedURLSessionDataTask: @unchecked Sendable {
29-
let lock = Locking.FastLock()
30-
var task: URLSessionDataTask?
31-
32-
func setAndResume(_ newTask: URLSessionDataTask) {
33-
self.lock.withLock {
34-
assert(self.task == nil)
35-
self.task = newTask
36-
newTask.resume()
37-
}
38-
}
39-
40-
func cancelAndClear() {
41-
self.lock.withLock {
42-
self.task?.cancel()
43-
self.task = nil
44-
}
45-
}
46-
}
47-
48-
/// An in-progress data task representing a request in flight
49-
private let task = LockedURLSessionDataTask()
50-
5128
public init(_ session: URLSession) {
52-
self.session = session
29+
self.session = .init(configuration: session.configuration, delegate: session.delegate, delegateQueue: session.delegateQueue)
5330
}
5431

5532
/// Sends the request using a `URLSessionDataTask`
@@ -58,7 +35,7 @@ public final class URLSessionTransport: Transport {
5835
/// - completion: The completion handler that is called after the response is received.
5936
/// - response: The received response from the server.
6037
public func send(request: URLRequest, completion: @escaping @Sendable (Result<TransportResponse, any Error>) -> Void) {
61-
self.task.setAndResume(self.session.dataTask(with: request) { (data, response, error) in
38+
self.session.dataTask(with: request) { data, response, error in
6239
if let error {
6340
return completion(.failure((error as? URLError)?.asTransportFailure ?? .unknown(error)))
6441
}
@@ -71,11 +48,13 @@ public final class URLSessionTransport: Transport {
7148
}
7249

7350
completion(.success(httpResponse.asTransportResponse(withData: data)))
74-
})
51+
}.resume()
7552
}
7653

7754
public func cancel() {
78-
self.task.cancelAndClear()
55+
self.session.getAllTasks {
56+
$0.forEach { $0.cancel() }
57+
}
7958
}
8059
}
8160

0 commit comments

Comments
 (0)