@@ -105,6 +105,8 @@ final class URLSessionHTTPClient {
105105 }
106106}
107107
108+ // MARK: - Data
109+
108110private class DataTaskManager : NSObject , URLSessionDataDelegate {
109111 private var tasks = ThreadSafeKeyValueStore < Int , DataTask > ( )
110112 private let delegateQueue : OperationQueue
@@ -231,6 +233,8 @@ private class DataTaskManager: NSObject, URLSessionDataDelegate {
231233 }
232234}
233235
236+ // MARK: - Download
237+
234238private class DownloadTaskManager : NSObject , URLSessionDownloadDelegate {
235239 private var tasks = ThreadSafeKeyValueStore < Int , DownloadTask > ( )
236240 private let delegateQueue : OperationQueue
@@ -353,6 +357,8 @@ private class DownloadTaskManager: NSObject, URLSessionDownloadDelegate {
353357 }
354358}
355359
360+ // MARK: - Upload
361+
356362private class UploadTaskManager : NSObject , URLSessionTaskDelegate , URLSessionDataDelegate {
357363 private var tasks = ThreadSafeKeyValueStore < Int , UploadTask > ( )
358364 private let sessionDelegateQueue : DispatchQueue
@@ -364,7 +370,7 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
364370 self . sessionDelegateOperationQueue = OperationQueue ( )
365371 self . sessionDelegateOperationQueue. underlyingQueue = self . sessionDelegateQueue
366372 self . sessionDelegateOperationQueue. name = self . sessionDelegateQueue. label
367- self . sessionDelegateOperationQueue. maxConcurrentOperationCount = 1
373+ // self.sessionDelegateOperationQueue.maxConcurrentOperationCount = 2
368374 super. init ( )
369375 self . session = URLSession (
370376 configuration: configuration,
@@ -399,9 +405,19 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
399405 guard let task = self . tasks [ task. taskIdentifier] else {
400406 return
401407 }
402- completionHandler ( task. inputStream)
403- // FIXME: serious hack here
404- task. runloop. run ( until: Date ( timeIntervalSinceNow: 10.0 ) )
408+
409+ do {
410+ let ( inputStream, runloop) = try task. createStream ( )
411+ completionHandler ( inputStream)
412+
413+ // FIXME: serious hack here
414+ runloop. schedule ( after: . init( Date ( ) . addingTimeInterval ( 5 ) ) ) {
415+ print ( " hi " )
416+ }
417+ runloop. run ( )
418+ } catch {
419+ task. complete ( with: . failure( error) )
420+ }
405421 }
406422
407423 func urlSession(
@@ -458,7 +474,6 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
458474 private let streamProvider : ( ) throws -> LegacyHTTPClientRequest . UploadStream ?
459475 private let completionHandler : LegacyHTTPClient . CompletionHandler
460476 private let progressHandler : LegacyHTTPClient . ProgressHandler ?
461- private var streams : Streams !
462477
463478 // URLSession APIs are thread safe
464479 // calls into this are guarded with dispatchPrecondition
@@ -467,7 +482,8 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
467482 private var streamBuffer : UploadStreamBuffer = . empty
468483 private let streamBufferLock = NSLock ( )
469484
470- let runloop : RunLoop
485+ private var runloop : RunLoop ?
486+ private var streams : Streams ?
471487
472488 init (
473489 underlying: URLSessionUploadTask ,
@@ -480,10 +496,10 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
480496 self . progressHandler = progressHandler
481497 self . completionHandler = completionHandler
482498
483- self . runloop = RunLoop . current
484-
485499 super. init ( )
500+ }
486501
502+ func createStream( ) throws -> ( inputStream: InputStream , runloop: RunLoop ) {
487503 // initialize the stream
488504 var _input : InputStream ?
489505 var _output : OutputStream ?
@@ -498,18 +514,17 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
498514 }
499515
500516 output. delegate = self
501- output. schedule ( in: self . runloop , forMode: . default)
517+ output. schedule ( in: . current , forMode: . default)
502518 output. open ( )
503519
520+ self . runloop = . current
504521 self . streams = Streams ( input: input, output: output)
505- }
506522
507- var inputStream : InputStream {
508- self . streams. input
523+ return ( inputStream: input, runloop: . current)
509524 }
510525
511- var outputStream : OutputStream {
512- self . streams. output
526+ var outputStream : OutputStream ? {
527+ self . streams? . output
513528 }
514529
515530 var response : HTTPClientResponse ? {
@@ -531,12 +546,14 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
531546
532547 func cancel( ) {
533548 self . underlying. cancel ( )
534- self . streams. close ( )
549+ self . streams? . close ( )
535550 }
536551
537552 func complete( with result: Result < HTTPClientResponse , Error > ) {
538553 self . completionHandler ( result)
539- self . streams. close ( )
554+ self . streams? . close ( )
555+ // FIXME: serious hack here
556+ //self.runloop.map{ CFRunLoopStop($0.getCFRunLoop()) }
540557 }
541558
542559 func progress( totalBytesSent: Int64 , totalBytesExpectedToSend: Int64 ) {
@@ -548,7 +565,7 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
548565 }
549566
550567 func stream( _ aStream: Stream , handle eventCode: Stream . Event ) {
551- guard aStream == self . outputStream else {
568+ guard let outputStream = self . outputStream , aStream == outputStream else {
552569 return
553570 }
554571
@@ -590,7 +607,7 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
590607 throw HTTPClientError
591608 . uploadError ( " Invalid upload state, cannot read upload buffer pointer " )
592609 }
593- return self . outputStream. write (
610+ return outputStream. write (
594611 unsafePointer,
595612 maxLength: Swift . min ( totalBytes, Self . bufferSize)
596613 )
@@ -611,7 +628,7 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
611628 if let leftover = leftover {
612629 // write any left over we could not write before
613630 let totalBytes = leftover. count
614- let bytesWritten = self . outputStream. write (
631+ let bytesWritten = outputStream. write (
615632 leftover,
616633 maxLength: Swift . min ( totalBytes, Self . bufferSize)
617634 )
@@ -640,7 +657,7 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
640657 self . streamBuffer = . empty
641658 inputStream. close ( )
642659 } else {
643- let bytesWritten = self . outputStream. write (
660+ let bytesWritten = outputStream. write (
644661 buffer,
645662 maxLength: Swift . min ( bytesRead, Self . bufferSize)
646663 )
@@ -665,7 +682,8 @@ private class UploadTaskManager: NSObject, URLSessionTaskDelegate, URLSessionDat
665682 }
666683 }
667684 case . empty:
668- self . streams. output. close ( )
685+ // done!
686+ outputStream. close ( )
669687 }
670688 }
671689 } catch {
0 commit comments