Skip to content

Commit e896adf

Browse files
committed
wip
1 parent 6fedc5d commit e896adf

File tree

1 file changed

+39
-21
lines changed

1 file changed

+39
-21
lines changed

Sources/Basics/HTTPClient/URLSessionHTTPClient.swift

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ final class URLSessionHTTPClient {
105105
}
106106
}
107107

108+
// MARK: - Data
109+
108110
private 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+
234238
private 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+
356362
private 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

Comments
 (0)