From be40f05b50f857984e127d3a2d9162f923be509c Mon Sep 17 00:00:00 2001 From: Floris Bos Date: Tue, 21 Dec 2021 23:07:53 +0100 Subject: [PATCH] Retry once on (GnuTLS) Recv errors Try resuming download on CURLE_RECV_ERROR. Will not retry more than once if nothing has been downloaded since last attempt. Ref #306 --- downloadthread.cpp | 5 +++-- downloadthread.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/downloadthread.cpp b/downloadthread.cpp index 067d2aa..d9741df 100644 --- a/downloadthread.cpp +++ b/downloadthread.cpp @@ -34,7 +34,7 @@ QByteArray DownloadThread::_proxy; int DownloadThread::_curlCount = 0; DownloadThread::DownloadThread(const QByteArray &url, const QByteArray &localfilename, const QByteArray &expectedHash, QObject *parent) : - QThread(parent), _startOffset(0), _lastDlTotal(0), _lastDlNow(0), _verifyTotal(0), _lastVerifyNow(0), _bytesWritten(0), _sectorsStart(-1), _url(url), _filename(localfilename), _expectedHash(expectedHash), + QThread(parent), _startOffset(0), _lastDlTotal(0), _lastDlNow(0), _verifyTotal(0), _lastVerifyNow(0), _bytesWritten(0), _lastFailureOffset(0), _sectorsStart(-1), _url(url), _filename(localfilename), _expectedHash(expectedHash), _firstBlock(nullptr), _cancelled(false), _successful(false), _verifyEnabled(false), _cacheEnabled(false), _lastModified(0), _serverTime(0), _lastFailureTime(0), _inputBufferSize(0), _file(NULL), _writehash(OSLIST_HASH_ALGORITHM), _verifyhash(OSLIST_HASH_ALGORITHM) { @@ -392,7 +392,7 @@ void DownloadThread::run() /* Deal with badly configured HTTP servers that terminate the connection quickly if connections stalls for some seconds while kernel commits buffers to slow SD card. And also reconnect if we detect from our end that transfer stalled for more than one minute */ - while (ret == CURLE_PARTIAL_FILE || ret == CURLE_OPERATION_TIMEDOUT) + while (ret == CURLE_PARTIAL_FILE || ret == CURLE_OPERATION_TIMEDOUT || (ret == CURLE_RECV_ERROR && _lastDlNow != _lastFailureOffset) ) { time_t t = time(NULL); qDebug() << "HTTP connection lost. Time:" << t; @@ -407,6 +407,7 @@ void DownloadThread::run() _lastFailureTime = t; _startOffset = _lastDlNow; + _lastFailureOffset = _lastDlNow; curl_easy_setopt(_c, CURLOPT_RESUME_FROM_LARGE, _startOffset); ret = curl_easy_perform(_c); diff --git a/downloadthread.h b/downloadthread.h index 63827c5..479841e 100644 --- a/downloadthread.h +++ b/downloadthread.h @@ -163,6 +163,7 @@ protected: CURL *_c; curl_off_t _startOffset; std::atomic _lastDlTotal, _lastDlNow, _verifyTotal, _lastVerifyNow, _bytesWritten; + std::uint64_t _lastFailureOffset; qint64 _sectorsStart; QByteArray _url, _useragent, _buf, _filename, _lastError, _expectedHash, _config, _cmdline, _firstrun, _cloudinit, _cloudinitNetwork, _initFormat; char *_firstBlock;