From ebe7695ee5803dd3c2bb4f22f5e12d776c985d56 Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Wed, 15 Feb 2023 14:47:15 +0100 Subject: structure cleanup: move libcurl utilities to other_tools... ...in order to not include unwanted dependencies in just proper. As the whole other_tools folder is meant to be excluded from bootstrapping, also remove the bootstrap guards. --- src/other_tools/utils/curl_easy_handle.hpp | 86 ++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/other_tools/utils/curl_easy_handle.hpp (limited to 'src/other_tools/utils/curl_easy_handle.hpp') diff --git a/src/other_tools/utils/curl_easy_handle.hpp b/src/other_tools/utils/curl_easy_handle.hpp new file mode 100644 index 00000000..4f6f33c9 --- /dev/null +++ b/src/other_tools/utils/curl_easy_handle.hpp @@ -0,0 +1,86 @@ +// Copyright 2022 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDED_SRC_OTHER_TOOLS_UTILS_CURL_EASY_HANDLE_HPP +#define INCLUDED_SRC_OTHER_TOOLS_UTILS_CURL_EASY_HANDLE_HPP + +#include +#include +#include +#include + +#include "gsl-lite/gsl-lite.hpp" +#include "src/other_tools/utils/curl_context.hpp" + +extern "C" { +#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER) +using CURL = struct Curl_easy; +#else +using CURL = void; +#endif +} + +void curl_easy_closer(gsl::owner curl); + +class CurlEasyHandle { + public: + CurlEasyHandle() noexcept = default; + ~CurlEasyHandle() noexcept = default; + + // prohibit moves and copies + CurlEasyHandle(CurlEasyHandle const&) = delete; + CurlEasyHandle(CurlEasyHandle&& other) = delete; + auto operator=(CurlEasyHandle const&) = delete; + auto operator=(CurlEasyHandle&& other) = delete; + + /// \brief Create a CurlEasyHandle object + [[nodiscard]] auto static Create() noexcept + -> std::shared_ptr; + + /// \brief Download file from URL into given file_path. + /// Will perform cleanup (i.e., remove empty file) in case download fails. + /// Returns 0 if successful. + [[nodiscard]] auto DownloadToFile( + std::string const& url, + std::filesystem::path const& file_path) noexcept -> int; + + /// \brief Download file from URL into string as binary. + /// Returns the content or nullopt if download failure. + [[nodiscard]] auto DownloadToString(std::string const& url) noexcept + -> std::optional; + + private: + // IMPORTANT: the CurlContext must to be initialized before any curl object! + CurlContext curl_context_{}; + std::unique_ptr handle_{ + nullptr, + curl_easy_closer}; + + /// \brief Overwrites write_callback to redirect to file instead of stdout. + [[nodiscard]] auto static EasyWriteToFile(gsl::owner data, + size_t size, + size_t nmemb, + gsl::owner userptr) + -> std::streamsize; + + /// \brief Overwrites write_callback to redirect to string instead of + /// stdout. + [[nodiscard]] auto static EasyWriteToString(gsl::owner data, + size_t size, + size_t nmemb, + gsl::owner userptr) + -> std::streamsize; +}; + +#endif // INCLUDED_SRC_OTHER_TOOLS_UTILS_CURL_EASY_HANDLE_HPP \ No newline at end of file -- cgit v1.2.3