@@ -129,43 +129,59 @@ internal class _NativeProtocol: URLProtocol, _EasyHandleDelegate {
129129 }
130130
131131 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 {
133133 fatalError ( " Cannot notify " )
134134 }
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+ }
158159 }
160+ default :
161+ break
159162 }
160163 }
161164
162165 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
169185 }
170186 }
171187
@@ -284,7 +300,7 @@ internal class _NativeProtocol: URLProtocol, _EasyHandleDelegate {
284300
285301 var currentInputStream : InputStream ?
286302
287- if let delegate = session . delegate as? URLSessionTaskDelegate {
303+ if let delegate = task ? . delegate {
288304 let dispatchGroup = DispatchGroup ( )
289305 dispatchGroup. enter ( )
290306
@@ -338,11 +354,13 @@ internal class _NativeProtocol: URLProtocol, _EasyHandleDelegate {
338354 // Data will be forwarded to the delegate as we receive it, we don't
339355 // need to do anything about it.
340356 return . ignore
341- case . dataCompletionHandler:
357+ case . dataCompletionHandler,
358+ . dataCompletionHandlerWithTaskDelegate:
342359 // Data needs to be concatenated in-memory such that we can pass it
343360 // to the completion handler upon completion.
344361 return . inMemory( nil )
345- case . downloadCompletionHandler:
362+ case . downloadCompletionHandler,
363+ . downloadCompletionHandlerWithTaskDelegate:
346364 // Data needs to be written to a file (i.e. a download task).
347365 let fileHandle = try ! FileHandle ( forWritingTo: self . tempFileURL)
348366 return . toFile( self . tempFileURL, fileHandle)
0 commit comments