@@ -56,6 +56,8 @@ internal final class _EasyHandle {
56
56
fileprivate var headerList : _CurlStringList ?
57
57
fileprivate var pauseState : _PauseState = [ ]
58
58
internal var fileLength : Int64 = 0
59
+ internal var timeoutTimer : _TimeoutSource !
60
+
59
61
init ( delegate: _EasyHandleDelegate ) {
60
62
self . delegate = delegate
61
63
setupCallbacks ( )
@@ -387,31 +389,47 @@ fileprivate extension _EasyHandle {
387
389
}
388
390
389
391
fileprivate extension _EasyHandle {
392
+
393
+ func resetTimer( ) {
394
+ //simply create a new timer with the same queue, timeout and handler
395
+ //this must cancel the old handler and reset the timer
396
+ timeoutTimer = _TimeoutSource ( queue: timeoutTimer. queue, milliseconds: timeoutTimer. milliseconds, handler: timeoutTimer. handler)
397
+ }
398
+
390
399
/// Forward the libcurl callbacks into Swift methods
391
400
func setupCallbacks( ) {
392
401
// write
393
402
try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionWRITEDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
394
403
395
404
try ! CFURLSession_easy_setopt_wc ( rawHandle, CFURLSessionOptionWRITEFUNCTION) { ( data: UnsafeMutablePointer < Int8 > , size: Int , nmemb: Int , userdata: UnsafeMutableRawPointer ? ) -> Int in
396
405
guard let handle = _EasyHandle. from ( callbackUserData: userdata) else { return 0 }
406
+ defer {
407
+ handle. resetTimer ( )
408
+ }
397
409
return handle. didReceive ( data: data, size: size, nmemb: nmemb)
398
- } . asError ( )
410
+ } . asError ( )
399
411
400
412
// read
401
413
try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionREADDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
402
414
try ! CFURLSession_easy_setopt_wc ( rawHandle, CFURLSessionOptionREADFUNCTION) { ( data: UnsafeMutablePointer < Int8 > , size: Int , nmemb: Int , userdata: UnsafeMutableRawPointer ? ) -> Int in
403
415
guard let handle = _EasyHandle. from ( callbackUserData: userdata) else { return 0 }
416
+ defer {
417
+ handle. resetTimer ( )
418
+ }
404
419
return handle. fill ( writeBuffer: data, size: size, nmemb: nmemb)
405
- } . asError ( )
420
+ } . asError ( )
406
421
407
422
// header
408
423
try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionHEADERDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
409
424
try ! CFURLSession_easy_setopt_wc ( rawHandle, CFURLSessionOptionHEADERFUNCTION) { ( data: UnsafeMutablePointer < Int8 > , size: Int , nmemb: Int , userdata: UnsafeMutableRawPointer ? ) -> Int in
410
425
guard let handle = _EasyHandle. from ( callbackUserData: userdata) else { return 0 }
426
+ defer {
427
+ handle. resetTimer ( )
428
+ }
411
429
var length = Double ( )
412
430
try ! CFURLSession_easy_getinfo_double ( handle. rawHandle, CFURLSessionInfoCONTENT_LENGTH_DOWNLOAD, & length) . asError ( )
413
431
return handle. didReceive ( headerData: data, size: size, nmemb: nmemb, fileLength: length)
414
- } . asError ( )
432
+ } . asError ( )
415
433
416
434
// socket options
417
435
try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionSOCKOPTDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
@@ -424,7 +442,7 @@ fileprivate extension _EasyHandle {
424
442
} catch {
425
443
return 1
426
444
}
427
- } . asError ( )
445
+ } . asError ( )
428
446
// seeking in input stream
429
447
try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionSEEKDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
430
448
try ! CFURLSession_easy_setopt_seek ( rawHandle, CFURLSessionOptionSEEKFUNCTION, { ( userdata, offset, origin) -> Int32 in
0 commit comments