From 4c117cd6c4b4378ce494da5fd6e944ae9ed831a5 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Thu, 3 Apr 2025 13:58:26 +0300 Subject: [PATCH 1/3] [win-linux] updatesvc: debug cdownloader --- .../src/classes/platform_linux/cdownloader.cpp | 11 ++++++++--- .../src/classes/platform_win/cdownloader.cpp | 10 ++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.cpp b/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.cpp index 391c8dcf8..5d3bba016 100644 --- a/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.cpp +++ b/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.cpp @@ -93,14 +93,18 @@ void CDownloader::queryContentLenght(const string &url) pimpl->m_lock = true; pimpl->m_future = std::async(std::launch::async, [=]() { - double fileSize = 0; + curl_off_t fileSize = 0; CURLcode res = CURLE_FAILED_INIT; if (CURL *curl = curl_easy_init()) { curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); res = curl_easy_perform(curl); - if (res == CURLE_OK) - curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &fileSize); + if (res == CURLE_OK) { + curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &fileSize); + if (fileSize < 0) fileSize = 0; + } curl_easy_cleanup(curl); } int error = (res == CURLE_OK) ? 0 : @@ -137,6 +141,7 @@ void CDownloader::start() if (CURL *curl = curl_easy_init()) { pimpl->m_prev_percent = -1; curl_easy_setopt(curl, CURLOPT_URL, pimpl->m_url.c_str()); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); diff --git a/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.cpp b/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.cpp index e890991eb..77a3aa5fe 100644 --- a/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.cpp +++ b/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.cpp @@ -87,10 +87,16 @@ static int initConnection(const wstring &url, DWORD &dwFileSize, Connection &con if (!WinHttpReceiveResponse(conn.hRequest, NULL)) return DNL_CONN_ERR; - DWORD dwSize = sizeof(DWORD); - if (!WinHttpQueryHeaders(conn.hRequest, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwFileSize, &dwSize, WINHTTP_NO_HEADER_INDEX)) + DWORD dwStatusCode = 0, dwSize = sizeof(DWORD); + if (!WinHttpQueryHeaders(conn.hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwSize, WINHTTP_NO_HEADER_INDEX)) return DNL_CONN_ERR; + if (dwStatusCode >= HTTP_STATUS_BAD_REQUEST) + return DNL_CONN_ERR; + + if (!WinHttpQueryHeaders(conn.hRequest, WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwFileSize, &dwSize, WINHTTP_NO_HEADER_INDEX)) + dwFileSize = 0; + return DNL_OK; } From 8df6d93811f3bc24f3bf51df8db81fba9933f514 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Thu, 3 Apr 2025 13:59:37 +0300 Subject: [PATCH 2/3] [win-linux] updatesvc: support alternative update URL --- .../update-daemon/src/classes/csvcmanager.cpp | 12 ++++++++++-- .../src/classes/platform_linux/cdownloader.cpp | 17 +++++++++++++++++ .../src/classes/platform_linux/cdownloader.h | 1 + .../src/classes/platform_win/cdownloader.cpp | 11 +++++++++++ .../src/classes/platform_win/cdownloader.h | 1 + 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp b/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp index 4b504015e..46d3e56b6 100644 --- a/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp +++ b/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp @@ -469,6 +469,7 @@ void CSvcManager::onCompleteSlot(const int error, const tstring &filePath) if (error == 0) { switch (m_downloadMode) { case Mode::CHECK_UPDATES: { + __GLOBAL_LOCK // isUrlAccessible may take a long time to execute tstring out_json; list lst; if (NS_File::readFile(filePath, lst)) { @@ -511,7 +512,10 @@ void CSvcManager::onCompleteSlot(const int error, const tstring &filePath) } } #endif - m_packageData->packageUrl = package_type.value(_T("url")).toTString(); + tstring url = package_type.value(_T("url")).toTString(); + tstring url2 = package_type.value(_T("url2")).toTString(); + NS_Logger::WriteLog(_T("Primary package URL: ") + url + _T("\nSecondary package URL: ") + url2); + m_packageData->packageUrl = ((url.empty() || !m_pDownloader->isUrlAccessible(url)) && !url2.empty()) ? url2 : url; tstring hash = package_type.value(_T("md5")).toTString(); std::transform(hash.begin(), hash.end(), hash.begin(), ::tolower); m_packageData->hash = hash; @@ -531,7 +535,10 @@ void CSvcManager::onCompleteSlot(const int error, const tstring &filePath) m_packageData->version = svc_version; m_packageData->fileType = _T("archive"); JsonObject package_type = win.value(_T("serviceArchive")).toObject(); - m_packageData->packageUrl = package_type.value(_T("url")).toTString(); + tstring url = package_type.value(_T("url")).toTString(); + tstring url2 = package_type.value(_T("url2")).toTString(); + NS_Logger::WriteLog(_T("Primary package URL: ") + url + _T("\nSecondary package URL: ") + url2); + m_packageData->packageUrl = ((url.empty() || !m_pDownloader->isUrlAccessible(url)) && !url2.empty()) ? url2 : url; tstring hash = package_type.value(_T("md5")).toTString(); std::transform(hash.begin(), hash.end(), hash.begin(), ::tolower); m_packageData->hash = hash; @@ -557,6 +564,7 @@ void CSvcManager::onCompleteSlot(const int error, const tstring &filePath) } else { // read error } + __UNLOCK m_socket->sendMessage(MSG_LoadCheckFinished, out_json); break; } diff --git a/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.cpp b/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.cpp index 5d3bba016..4842e550a 100644 --- a/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.cpp +++ b/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.cpp @@ -86,6 +86,23 @@ CDownloader::~CDownloader() delete pimpl, pimpl = nullptr; } +bool CDownloader::isUrlAccessible(const string &url) +{ + if (url.empty()) + return false; + + CURLcode res = CURLE_FAILED_INIT; + if (CURL *curl = curl_easy_init()) { + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1L); + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + } + return res == CURLE_OK; +} + void CDownloader::queryContentLenght(const string &url) { if (url.empty() || pimpl->m_lock) diff --git a/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.h b/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.h index 3b5420342..2b03e8d8f 100644 --- a/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.h +++ b/win-linux/extras/update-daemon/src/classes/platform_linux/cdownloader.h @@ -50,6 +50,7 @@ public: CDownloader(); ~CDownloader(); + bool isUrlAccessible(const string &url); void queryContentLenght(const string &url); void downloadFile(const string &url, const string &filePath); void start(); diff --git a/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.cpp b/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.cpp index 77a3aa5fe..d30b9a4c4 100644 --- a/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.cpp +++ b/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.cpp @@ -195,6 +195,17 @@ CDownloader::~CDownloader() delete pimpl, pimpl = nullptr; } +bool CDownloader::isUrlAccessible(const wstring &url) +{ + if (url.empty()) + return false; + + DWORD dwFileSize = 0; + Connection conn; + int hr = initConnection(url, dwFileSize, conn); + return hr == DNL_OK; +} + void CDownloader::queryContentLenght(const wstring &url) { if (url.empty() || pimpl->m_lock) diff --git a/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.h b/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.h index dfc5f6d0f..7d64032e0 100644 --- a/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.h +++ b/win-linux/extras/update-daemon/src/classes/platform_win/cdownloader.h @@ -50,6 +50,7 @@ public: CDownloader(); ~CDownloader(); + bool isUrlAccessible(const wstring &url); void queryContentLenght(const wstring &url); void downloadFile(const wstring &url, const wstring &filePath); void start(); From b36817309be700a6006beb31d74c63d51c11b1b5 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Thu, 3 Apr 2025 14:00:17 +0300 Subject: [PATCH 3/3] [win-linux] updmanager: exclude parameters from messages --- win-linux/extras/update-daemon/src/classes/csvcmanager.cpp | 6 +++--- win-linux/src/cupdatemanager.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp b/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp index 46d3e56b6..8c9632f02 100644 --- a/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp +++ b/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp @@ -330,14 +330,14 @@ void CSvcManager::init() tstring ext = m_packageData->fileType == _T("iss") ? _T(".exe") : m_packageData->fileType == _T("msi") ? _T(".msi") : ARCHIVE_EXT; m_pDownloader->downloadFile(m_packageData->packageUrl, generateTmpFileName(ext)); } - NS_Logger::WriteLog(_T("Received MSG_LoadUpdates, URL: ") + params[1]); + NS_Logger::WriteLog(_T("Received MSG_LoadUpdates, URL: ") + m_packageData->packageUrl); break; } case MSG_RequestContentLenght: { __GLOBAL_LOCK if (m_pDownloader) - m_pDownloader->queryContentLenght(params[1]); - NS_Logger::WriteLog(_T("Received MSG_RequestContentLenght, URL: ") + params[1]); + m_pDownloader->queryContentLenght(m_packageData->packageUrl); + NS_Logger::WriteLog(_T("Received MSG_RequestContentLenght, URL: ") + m_packageData->packageUrl); break; } case MSG_StopDownload: { diff --git a/win-linux/src/cupdatemanager.cpp b/win-linux/src/cupdatemanager.cpp index 53e5f2406..897eceb37 100644 --- a/win-linux/src/cupdatemanager.cpp +++ b/win-linux/src/cupdatemanager.cpp @@ -820,7 +820,7 @@ void CUpdateManager::onLoadCheckFinished(const QString &json) m_packageData->isInstallable = root.value("isInstallable").toBool(); clearTempFiles(m_packageData->isInstallable && isSavedPackageValid() ? m_savedPackageData->fileName : ""); - if (m_packageData->packageUrl.empty() || !m_socket->sendMessage(MSG_RequestContentLenght, WStrToTStr(m_packageData->packageUrl))) { + if (m_packageData->packageUrl.empty() || !m_socket->sendMessage(MSG_RequestContentLenght)) { m_packageData->fileSize = "--"; onCheckFinished(false, true, m_packageData->version, ""); }