@@ -130,27 +130,77 @@ public final class URLSessionProxy: URLSessionProtocol, @unchecked Sendable {
130
130
}
131
131
132
132
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
134
145
}
135
146
136
147
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
138
160
}
139
161
162
+ @available ( iOS 17 , tvOS 17 , macOS 14 , watchOS 9 , * )
140
163
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
142
176
}
143
177
144
178
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
146
188
}
147
189
148
190
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 )
150
192
}
151
193
152
194
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
154
204
}
155
205
156
206
// MARK: - URLSessionProtocol (Combine)
@@ -221,22 +271,46 @@ public final class URLSessionProxy: URLSessionProtocol, @unchecked Sendable {
221
271
}
222
272
223
273
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
+ }
225
287
}
226
288
227
289
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 )
229
291
}
230
292
231
293
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
+ }
233
307
}
234
308
235
309
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 )
237
311
}
238
312
239
313
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 )
241
315
}
242
316
}
0 commit comments