@@ -52,7 +52,7 @@ import Dispatch
52
52
/// `Dispatch` only -- it is intentionally **not** thread safe.
53
53
internal final class _EasyHandle {
54
54
let rawHandle = CFURLSessionEasyHandleInit ( )
55
- unowned let delegate : _EasyHandleDelegate
55
+ weak var delegate : _EasyHandleDelegate ?
56
56
fileprivate var headerList : _CurlStringList ?
57
57
fileprivate var pauseState : _PauseState = [ ]
58
58
internal var fileLength : Int64 = 0
@@ -88,7 +88,7 @@ extension _EasyHandle {
88
88
89
89
internal extension _EasyHandle {
90
90
func completedTransfer( withErrorCode errorCode: Int ? ) {
91
- delegate. transferCompleted ( withErrorCode: errorCode)
91
+ delegate? . transferCompleted ( withErrorCode: errorCode)
92
92
}
93
93
}
94
94
internal protocol _EasyHandleDelegate : class {
@@ -479,12 +479,15 @@ fileprivate extension _EasyHandle {
479
479
func didReceive( data: UnsafeMutablePointer < Int8 > , size: Int , nmemb: Int ) -> Int {
480
480
let d : Int = {
481
481
let buffer = Data ( bytes: data, count: size*nmemb)
482
- switch delegate. didReceive ( data: buffer) {
483
- case . proceed: return size * nmemb
484
- case . abort: return 0
485
- case . pause:
482
+ switch delegate? . didReceive ( data: buffer) {
483
+ case . some ( . proceed) : return size * nmemb
484
+ case . some ( . abort) : return 0
485
+ case . some ( . pause) :
486
486
pauseState. insert ( . receivePaused)
487
487
return Int ( CFURLSessionWriteFuncPause)
488
+ case . none:
489
+ /* the delegate disappeared */
490
+ return 0
488
491
}
489
492
} ( )
490
493
return d
@@ -497,12 +500,15 @@ fileprivate extension _EasyHandle {
497
500
self . fileLength = Int64 ( fileLength)
498
501
let d : Int = {
499
502
let buffer = Data ( bytes: data, count: size*nmemb)
500
- switch delegate. didReceive ( headerData: buffer) {
501
- case . proceed: return size * nmemb
502
- case . abort: return 0
503
- case . pause:
503
+ switch delegate? . didReceive ( headerData: buffer) {
504
+ case . some ( . proceed) : return size * nmemb
505
+ case . some ( . abort) : return 0
506
+ case . some ( . pause) :
504
507
pauseState. insert ( . receivePaused)
505
508
return Int ( CFURLSessionWriteFuncPause)
509
+ case . none:
510
+ /* the delegate disappeared */
511
+ return 0
506
512
}
507
513
} ( )
508
514
return d
@@ -514,14 +520,17 @@ fileprivate extension _EasyHandle {
514
520
func fill( writeBuffer data: UnsafeMutablePointer < Int8 > , size: Int , nmemb: Int ) -> Int {
515
521
let d : Int = {
516
522
let buffer = UnsafeMutableBufferPointer ( start: data, count: size * nmemb)
517
- switch delegate. fill ( writeBuffer: buffer) {
518
- case . pause:
523
+ switch delegate? . fill ( writeBuffer: buffer) {
524
+ case . some ( . pause) :
519
525
pauseState. insert ( . sendPaused)
520
526
return Int ( CFURLSessionReadFuncPause)
521
- case . abort:
527
+ case . some ( . abort) :
522
528
return Int ( CFURLSessionReadFuncAbort)
523
- case . bytes( let length) :
529
+ case . some ( . bytes( let length) ) :
524
530
return length
531
+ case . none:
532
+ /* the delegate disappeared */
533
+ return Int ( CFURLSessionReadFuncAbort)
525
534
}
526
535
} ( )
527
536
return d
@@ -541,16 +550,20 @@ fileprivate extension _EasyHandle {
541
550
// <https://en.wikipedia.org/wiki/Quality_of_service>
542
551
}
543
552
func updateProgressMeter( with propgress: _Progress ) {
544
- delegate. updateProgressMeter ( with: propgress)
553
+ delegate? . updateProgressMeter ( with: propgress)
545
554
}
546
555
547
556
func seekInputStream( offset: Int64 , origin: CInt ) -> CInt {
548
557
let d : Int32 = {
549
558
/// libcurl should only use SEEK_SET
550
559
guard origin == SEEK_SET else { fatalError ( " Unexpected 'origin' in seek. " ) }
551
560
do {
552
- try delegate. seekInputStream ( to: UInt64 ( offset) )
553
- return CFURLSessionSeekOk
561
+ if let delegate = delegate {
562
+ try delegate. seekInputStream ( to: UInt64 ( offset) )
563
+ return CFURLSessionSeekOk
564
+ } else {
565
+ return CFURLSessionSeekCantSeek
566
+ }
554
567
} catch {
555
568
return CFURLSessionSeekCantSeek
556
569
}
0 commit comments