@@ -262,27 +262,38 @@ internal class _NativeProtocol: URLProtocol, _EasyHandleDelegate {
262
262
func seekInputStream( to position: UInt64 ) throws {
263
263
// We will reset the body source and seek forward.
264
264
guard let session = task? . session as? URLSession else { fatalError ( ) }
265
+
266
+ var currentInputStream : InputStream ?
267
+
265
268
if let delegate = session. delegate as? URLSessionTaskDelegate {
266
- delegate. urlSession ( session, task: task!, needNewBodyStream: { [ weak self] inputStream in
267
- if let strongSelf = self , let url = strongSelf. request. url, let inputStream = inputStream {
268
- switch strongSelf. internalState {
269
- case . transferInProgress( let currentTransferState) :
270
- switch currentTransferState. requestBodySource {
271
- case is _BodyStreamSource :
272
- try inputStream. seek ( to: position)
273
- let drain = strongSelf. createTransferBodyDataDrain ( )
274
- let source = _BodyStreamSource ( inputStream: inputStream)
275
- let transferState = _TransferState ( url: url, bodyDataDrain: drain, bodySource: source)
276
- strongSelf. internalState = . transferInProgress( transferState)
277
- default :
278
- NSUnimplemented ( )
279
- }
280
- default :
281
- //TODO: it's possible?
282
- break
283
- }
284
- }
269
+ let dispatchGroup = DispatchGroup ( )
270
+ dispatchGroup. enter ( )
271
+
272
+ delegate. urlSession ( session, task: task!, needNewBodyStream: { inputStream in
273
+ currentInputStream = inputStream
274
+ dispatchGroup. leave ( )
285
275
} )
276
+
277
+ _ = dispatchGroup. wait ( timeout: . now( ) + 7 )
278
+ }
279
+
280
+ if let url = self . request. url, let inputStream = currentInputStream {
281
+ switch self . internalState {
282
+ case . transferInProgress( let currentTransferState) :
283
+ switch currentTransferState. requestBodySource {
284
+ case is _BodyStreamSource :
285
+ try inputStream. seek ( to: position)
286
+ let drain = self . createTransferBodyDataDrain ( )
287
+ let source = _BodyStreamSource ( inputStream: inputStream)
288
+ let transferState = _TransferState ( url: url, bodyDataDrain: drain, bodySource: source)
289
+ self . internalState = . transferInProgress( transferState)
290
+ default :
291
+ NSUnimplemented ( )
292
+ }
293
+ default :
294
+ //TODO: it's possible?
295
+ break
296
+ }
286
297
}
287
298
}
288
299
0 commit comments