From ad69fdd8c0f7e9b559c03bfc33c27ffdf1e633a1 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Fri, 19 Oct 2018 11:47:55 +0200 Subject: [PATCH] Move the download method from the downloader to networkTools. The download method is a simple method to download content. It use curl to download the content instead of aria. --- include/common/networkTools.h | 1 + include/downloader.h | 8 -------- src/common/networkTools.cpp | 32 ++++++++++++++++++++++++++++++++ src/downloader.cpp | 27 --------------------------- src/manager.cpp | 11 ++++------- 5 files changed, 37 insertions(+), 42 deletions(-) diff --git a/include/common/networkTools.h b/include/common/networkTools.h index 6ab2e1e56..8ca5919b1 100644 --- a/include/common/networkTools.h +++ b/include/common/networkTools.h @@ -44,6 +44,7 @@ namespace kiwix { std::map getNetworkInterfaces(); std::string getBestPublicIp(); +std::string download(const std::string& url); } #endif diff --git a/include/downloader.h b/include/downloader.h index 13e1a229b..e7afa6d8d 100644 --- a/include/downloader.h +++ b/include/downloader.h @@ -89,14 +89,6 @@ class Downloader void close(); - /** - * Download a content. - * - * @param url the url to download - * @return the content downloaded. - */ - DownloadedFile download(const std::string& url); - Download* startDownload(const std::string& uri); Download* getDownload(const std::string& did); diff --git a/src/common/networkTools.cpp b/src/common/networkTools.cpp index d2516996a..9ee98e488 100644 --- a/src/common/networkTools.cpp +++ b/src/common/networkTools.cpp @@ -19,6 +19,9 @@ #include +#include + +#include std::map kiwix::getNetworkInterfaces() @@ -160,3 +163,32 @@ std::string kiwix::getBestPublicIp() return "127.0.0.1"; } + +size_t write_callback_to_iss(char* ptr, size_t size, size_t nmemb, void* userdata) +{ + auto str = static_cast(userdata); + str->write(ptr, nmemb); + return nmemb; +} + +std::string kiwix::download(const std::string& url) { + auto curl = curl_easy_init(); + std::stringstream ss; + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_PORT, 80); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_callback_to_iss); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ss); + auto res = curl_easy_perform(curl); + if (res != CURLE_OK) { + curl_easy_cleanup(curl); + throw std::runtime_error("Cannot perform request"); + } + long response_code; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); + curl_easy_cleanup(curl); + if (response_code != 200) { + throw std::runtime_error("Invalid return code from server"); + } + return ss.str(); +} diff --git a/src/downloader.cpp b/src/downloader.cpp index 9db8dc2ca..6902ea2ee 100644 --- a/src/downloader.cpp +++ b/src/downloader.cpp @@ -122,33 +122,6 @@ std::vector Downloader::getDownloadIds() { return ret; } -DownloadedFile Downloader::download(const std::string& url) { - DownloadedFile fileHandle; - try { - std::vector status_key = {"status", "files"}; - auto download = startDownload(url); - std::cerr << "gid is : " << download->getDid() << std::endl; - pugi::xml_document ret; - while(true) { - download->updateStatus(); - std::cerr << "Status is " << download->getStatus() << std::endl; - if (download->getStatus() == Download::COMPLETE) { - fileHandle.success = true; - fileHandle.path = download->getPath(); - std::cerr << "FilePath is " << fileHandle.path << std::endl; - } else if (download->getStatus() == Download::ERROR) { - fileHandle.success = false; - } else { - // [TODO] Be wise here. - std::this_thread::sleep_for(std::chrono::microseconds(100000)); - continue; - } - break; - } - } catch (...) { std::cerr << "waautena " << std::endl; }; - return fileHandle; -} - Download* Downloader::startDownload(const std::string& uri) { for (auto& p: m_knownDownloads) { diff --git a/src/manager.cpp b/src/manager.cpp index 41709ef00..ce841a146 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -18,7 +18,7 @@ */ #include "manager.h" -#include "downloader.h" +#include "common/networkTools.h" #include @@ -108,13 +108,10 @@ bool Manager::parseOpdsDom(const pugi::xml_document& doc, const std::string& url if (rel == "http://opds-spec.org/image/thumbnail") { auto faviconUrl = urlHost + linkNode.attribute("href").value(); - Downloader downloader; - auto fileHandle = downloader.download(faviconUrl); - if (fileHandle.success) { - auto content = getFileContent(fileHandle.path); - book.setFavicon(content); + try { + book.setFavicon(download(faviconUrl)); book.setFaviconMimeType(linkNode.attribute("type").value()); - } else { + } catch (...) { std::cerr << "Cannot get favicon content from " << faviconUrl << std::endl; } break;