Skip to content

Commit 3498036

Browse files
committed
Add support for tracking remaining URLSession APIs
1 parent a915a24 commit 3498036

File tree

1 file changed

+85
-11
lines changed

1 file changed

+85
-11
lines changed

Sources/Pulse/URLSessionProxy/URLSessionProxy.swift

+85-11
Original file line numberDiff line numberDiff line change
@@ -130,27 +130,77 @@ public final class URLSessionProxy: URLSessionProtocol, @unchecked Sendable {
130130
}
131131

132132
public func uploadTask(with request: URLRequest, fromFile fileURL: URL, completionHandler: @escaping @Sendable (Data?, URLResponse?, (any Error)?) -> Void) -> URLSessionUploadTask {
133-
fatalError("Not implemented")
133+
let box = Mutex<URLSessionUploadTask?>(nil)
134+
let task = session.uploadTask(with: request, fromFile: fileURL) { [logger] data, response, error in
135+
if let task = box.value {
136+
if let data {
137+
logger.logDataTask(task, didReceive: data)
138+
}
139+
logger.logTask(task, didCompleteWithError: error)
140+
}
141+
completionHandler(data, response, error)
142+
}
143+
box.value = task
144+
return task
134145
}
135146

136147
public func uploadTask(with request: URLRequest, from bodyData: Data?, completionHandler: @escaping @Sendable (Data?, URLResponse?, (any Error)?) -> Void) -> URLSessionUploadTask {
137-
fatalError("Not implemented")
148+
let box = Mutex<URLSessionUploadTask?>(nil)
149+
let task = session.uploadTask(with: request, from: bodyData) { [logger] data, response, error in
150+
if let task = box.value {
151+
if let data {
152+
logger.logDataTask(task, didReceive: data)
153+
}
154+
logger.logTask(task, didCompleteWithError: error)
155+
}
156+
completionHandler(data, response, error)
157+
}
158+
box.value = task
159+
return task
138160
}
139161

162+
@available(iOS 17, tvOS 17, macOS 14, watchOS 9, *)
140163
public func uploadTask(withResumeData resumeData: Data, completionHandler: @escaping @Sendable (Data?, URLResponse?, (any Error)?) -> Void) -> URLSessionUploadTask {
141-
fatalError("Not implemented")
164+
let box = Mutex<URLSessionUploadTask?>(nil)
165+
let task = session.uploadTask(withResumeData: resumeData) { [logger] data, response, error in
166+
if let task = box.value {
167+
if let data {
168+
logger.logDataTask(task, didReceive: data)
169+
}
170+
logger.logTask(task, didCompleteWithError: error)
171+
}
172+
completionHandler(data, response, error)
173+
}
174+
box.value = task
175+
return task
142176
}
143177

144178
public func downloadTask(with request: URLRequest, completionHandler: @escaping @Sendable (URL?, URLResponse?, (any Error)?) -> Void) -> URLSessionDownloadTask {
145-
fatalError("Not implemented")
179+
let box = Mutex<URLSessionDownloadTask?>(nil)
180+
let task = session.downloadTask(with: request) { [logger] url, response, error in
181+
if let task = box.value {
182+
logger.logTask(task, didCompleteWithError: error)
183+
}
184+
completionHandler(url, response, error)
185+
}
186+
box.value = task
187+
return task
146188
}
147189

148190
public func downloadTask(with url: URL, completionHandler: @escaping @Sendable (URL?, URLResponse?, (any Error)?) -> Void) -> URLSessionDownloadTask {
149-
fatalError("Not implemented")
191+
downloadTask(with: URLRequest(url: url), completionHandler: completionHandler)
150192
}
151193

152194
public func downloadTask(withResumeData resumeData: Data, completionHandler: @escaping @Sendable (URL?, URLResponse?, (any Error)?) -> Void) -> URLSessionDownloadTask {
153-
fatalError("Not implemented")
195+
let box = Mutex<URLSessionDownloadTask?>(nil)
196+
let task = session.downloadTask(withResumeData: resumeData) { [logger] url, response, error in
197+
if let task = box.value {
198+
logger.logTask(task, didCompleteWithError: error)
199+
}
200+
completionHandler(url, response, error)
201+
}
202+
box.value = task
203+
return task
154204
}
155205

156206
// MARK: - URLSessionProtocol (Combine)
@@ -221,22 +271,46 @@ public final class URLSessionProxy: URLSessionProtocol, @unchecked Sendable {
221271
}
222272

223273
public func download(for request: URLRequest, delegate: (any URLSessionTaskDelegate)?) async throws -> (URL, URLResponse) {
224-
fatalError("Not implemented")
274+
let delegate = URLSessionProxyDelegate(logger: logger, delegate: delegate)
275+
do {
276+
let (url, response) = try await session.download(for: request, delegate: delegate)
277+
if let task = delegate.createdTask.value as? URLSessionDownloadTask {
278+
logger.logTask(task, didCompleteWithError: nil)
279+
}
280+
return (url, response)
281+
} catch {
282+
if let task = delegate.createdTask.value {
283+
logger.logTask(task, didCompleteWithError: error)
284+
}
285+
throw error
286+
}
225287
}
226288

227289
public func download(from url: URL, delegate: (any URLSessionTaskDelegate)?) async throws -> (URL, URLResponse) {
228-
fatalError("Not implemented")
290+
try await download(for: URLRequest(url: url), delegate: delegate)
229291
}
230292

231293
public func download(resumeFrom resumeData: Data, delegate: (any URLSessionTaskDelegate)?) async throws -> (URL, URLResponse) {
232-
fatalError("Not implemented")
294+
let delegate = URLSessionProxyDelegate(logger: logger, delegate: delegate)
295+
do {
296+
let (url, response) = try await session.download(resumeFrom: resumeData, delegate: delegate)
297+
if let task = delegate.createdTask.value as? URLSessionDownloadTask {
298+
logger.logTask(task, didCompleteWithError: nil)
299+
}
300+
return (url, response)
301+
} catch {
302+
if let task = delegate.createdTask.value {
303+
logger.logTask(task, didCompleteWithError: error)
304+
}
305+
throw error
306+
}
233307
}
234308

235309
public func bytes(for request: URLRequest, delegate: (any URLSessionTaskDelegate)?) async throws -> (URLSession.AsyncBytes, URLResponse) {
236-
fatalError("Not implemented")
310+
try await session.bytes(for: request, delegate: delegate)
237311
}
238312

239313
public func bytes(from url: URL, delegate: (any URLSessionTaskDelegate)?) async throws -> (URLSession.AsyncBytes, URLResponse) {
240-
fatalError("Not implemented")
314+
try await session.bytes(from: url, delegate: delegate)
241315
}
242316
}

0 commit comments

Comments
 (0)