@@ -129,43 +129,59 @@ internal class _NativeProtocol: URLProtocol, _EasyHandleDelegate {
129
129
}
130
130
131
131
fileprivate func notifyDelegate( aboutReceivedData data: Data ) {
132
- guard let t = self . task else {
132
+ guard let task = self . task, let session = task . session as? URLSession else {
133
133
fatalError ( " Cannot notify " )
134
134
}
135
- if case . taskDelegate( let delegate) = t. session. behaviour ( for: self . task!) ,
136
- let dataDelegate = delegate as? URLSessionDataDelegate ,
137
- let task = self . task as? URLSessionDataTask {
138
- // Forward to the delegate:
139
- guard let s = self . task? . session as? URLSession else {
140
- fatalError ( )
141
- }
142
- s. delegateQueue. addOperation {
143
- dataDelegate. urlSession ( s, dataTask: task, didReceive: data)
144
- }
145
- } else if case . taskDelegate( let delegate) = t. session. behaviour ( for: self . task!) ,
146
- let downloadDelegate = delegate as? URLSessionDownloadDelegate ,
147
- let task = self . task as? URLSessionDownloadTask {
148
- guard let s = self . task? . session as? URLSession else {
149
- fatalError ( )
150
- }
151
- let fileHandle = try ! FileHandle ( forWritingTo: self . tempFileURL)
152
- _ = fileHandle. seekToEndOfFile ( )
153
- fileHandle. write ( data)
154
- task. countOfBytesReceived += Int64 ( data. count)
155
- s. delegateQueue. addOperation {
156
- downloadDelegate. urlSession ( s, downloadTask: task, didWriteData: Int64 ( data. count) , totalBytesWritten: task. countOfBytesReceived,
157
- totalBytesExpectedToWrite: task. countOfBytesExpectedToReceive)
135
+ switch task. session. behaviour ( for: task) {
136
+ case . taskDelegate( let delegate) ,
137
+ . dataCompletionHandlerWithTaskDelegate( _, let delegate) ,
138
+ . downloadCompletionHandlerWithTaskDelegate( _, let delegate) :
139
+ if let dataDelegate = delegate as? URLSessionDataDelegate ,
140
+ let dataTask = task as? URLSessionDataTask {
141
+ session. delegateQueue. addOperation {
142
+ dataDelegate. urlSession ( session, dataTask: dataTask, didReceive: data)
143
+ }
144
+ } else if let downloadDelegate = delegate as? URLSessionDownloadDelegate ,
145
+ let downloadTask = task as? URLSessionDownloadTask {
146
+ let fileHandle = try ! FileHandle ( forWritingTo: self . tempFileURL)
147
+ _ = fileHandle. seekToEndOfFile ( )
148
+ fileHandle. write ( data)
149
+ task. countOfBytesReceived += Int64 ( data. count)
150
+ session. delegateQueue. addOperation {
151
+ downloadDelegate. urlSession (
152
+ session,
153
+ downloadTask: downloadTask,
154
+ didWriteData: Int64 ( data. count) ,
155
+ totalBytesWritten: task. countOfBytesReceived,
156
+ totalBytesExpectedToWrite: task. countOfBytesExpectedToReceive
157
+ )
158
+ }
158
159
}
160
+ default :
161
+ break
159
162
}
160
163
}
161
164
162
165
fileprivate func notifyDelegate( aboutUploadedData count: Int64 ) {
163
- guard let task = self . task, let session = task. session as? URLSession ,
164
- case . taskDelegate( let delegate) = session. behaviour ( for: task) else { return }
165
- task. countOfBytesSent += count
166
- session. delegateQueue. addOperation {
167
- delegate. urlSession ( session, task: task, didSendBodyData: count,
168
- totalBytesSent: task. countOfBytesSent, totalBytesExpectedToSend: task. countOfBytesExpectedToSend)
166
+ guard let task = self . task, let session = task. session as? URLSession else {
167
+ return
168
+ }
169
+ switch session. behaviour ( for: task) {
170
+ case . taskDelegate( let delegate) ,
171
+ . dataCompletionHandlerWithTaskDelegate( _, let delegate) ,
172
+ . downloadCompletionHandlerWithTaskDelegate( _, let delegate) :
173
+ task. countOfBytesSent += count
174
+ session. delegateQueue. addOperation {
175
+ delegate. urlSession (
176
+ session,
177
+ task: task,
178
+ didSendBodyData: count,
179
+ totalBytesSent: task. countOfBytesSent,
180
+ totalBytesExpectedToSend: task. countOfBytesExpectedToSend
181
+ )
182
+ }
183
+ default :
184
+ break
169
185
}
170
186
}
171
187
@@ -284,7 +300,7 @@ internal class _NativeProtocol: URLProtocol, _EasyHandleDelegate {
284
300
285
301
var currentInputStream : InputStream ?
286
302
287
- if let delegate = session . delegate as? URLSessionTaskDelegate {
303
+ if let delegate = task ? . delegate {
288
304
let dispatchGroup = DispatchGroup ( )
289
305
dispatchGroup. enter ( )
290
306
@@ -338,11 +354,13 @@ internal class _NativeProtocol: URLProtocol, _EasyHandleDelegate {
338
354
// Data will be forwarded to the delegate as we receive it, we don't
339
355
// need to do anything about it.
340
356
return . ignore
341
- case . dataCompletionHandler:
357
+ case . dataCompletionHandler,
358
+ . dataCompletionHandlerWithTaskDelegate:
342
359
// Data needs to be concatenated in-memory such that we can pass it
343
360
// to the completion handler upon completion.
344
361
return . inMemory( nil )
345
- case . downloadCompletionHandler:
362
+ case . downloadCompletionHandler,
363
+ . downloadCompletionHandlerWithTaskDelegate:
346
364
// Data needs to be written to a file (i.e. a download task).
347
365
let fileHandle = try ! FileHandle ( forWritingTo: self . tempFileURL)
348
366
return . toFile( self . tempFileURL, fileHandle)
0 commit comments