@@ -56,6 +56,8 @@ internal final class _EasyHandle {
5656 fileprivate var headerList : _CurlStringList ?
5757 fileprivate var pauseState : _PauseState = [ ]
5858 internal var fileLength : Int64 = 0
59+ internal var timeoutTimer : _TimeoutSource !
60+
5961 init ( delegate: _EasyHandleDelegate ) {
6062 self . delegate = delegate
6163 setupCallbacks ( )
@@ -387,31 +389,47 @@ fileprivate extension _EasyHandle {
387389}
388390
389391fileprivate 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+
390399 /// Forward the libcurl callbacks into Swift methods
391400 func setupCallbacks( ) {
392401 // write
393402 try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionWRITEDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
394403
395404 try ! CFURLSession_easy_setopt_wc ( rawHandle, CFURLSessionOptionWRITEFUNCTION) { ( data: UnsafeMutablePointer < Int8 > , size: Int , nmemb: Int , userdata: UnsafeMutableRawPointer ? ) -> Int in
396405 guard let handle = _EasyHandle. from ( callbackUserData: userdata) else { return 0 }
406+ defer {
407+ handle. resetTimer ( )
408+ }
397409 return handle. didReceive ( data: data, size: size, nmemb: nmemb)
398- } . asError ( )
410+ } . asError ( )
399411
400412 // read
401413 try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionREADDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
402414 try ! CFURLSession_easy_setopt_wc ( rawHandle, CFURLSessionOptionREADFUNCTION) { ( data: UnsafeMutablePointer < Int8 > , size: Int , nmemb: Int , userdata: UnsafeMutableRawPointer ? ) -> Int in
403415 guard let handle = _EasyHandle. from ( callbackUserData: userdata) else { return 0 }
416+ defer {
417+ handle. resetTimer ( )
418+ }
404419 return handle. fill ( writeBuffer: data, size: size, nmemb: nmemb)
405- } . asError ( )
420+ } . asError ( )
406421
407422 // header
408423 try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionHEADERDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
409424 try ! CFURLSession_easy_setopt_wc ( rawHandle, CFURLSessionOptionHEADERFUNCTION) { ( data: UnsafeMutablePointer < Int8 > , size: Int , nmemb: Int , userdata: UnsafeMutableRawPointer ? ) -> Int in
410425 guard let handle = _EasyHandle. from ( callbackUserData: userdata) else { return 0 }
426+ defer {
427+ handle. resetTimer ( )
428+ }
411429 var length = Double ( )
412430 try ! CFURLSession_easy_getinfo_double ( handle. rawHandle, CFURLSessionInfoCONTENT_LENGTH_DOWNLOAD, & length) . asError ( )
413431 return handle. didReceive ( headerData: data, size: size, nmemb: nmemb, fileLength: length)
414- } . asError ( )
432+ } . asError ( )
415433
416434 // socket options
417435 try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionSOCKOPTDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
@@ -424,7 +442,7 @@ fileprivate extension _EasyHandle {
424442 } catch {
425443 return 1
426444 }
427- } . asError ( )
445+ } . asError ( )
428446 // seeking in input stream
429447 try ! CFURLSession_easy_setopt_ptr ( rawHandle, CFURLSessionOptionSEEKDATA, UnsafeMutableRawPointer ( Unmanaged . passUnretained ( self ) . toOpaque ( ) ) ) . asError ( )
430448 try ! CFURLSession_easy_setopt_seek ( rawHandle, CFURLSessionOptionSEEKFUNCTION, { ( userdata, offset, origin) -> Int32 in
0 commit comments