7 #ifndef KVIKIO_LIBCURL_FOUND
9 "cannot include the remote IO API, please build KvikIO with libcurl (-DKvikIO_REMOTE_SUPPORT=ON)"
19 #include <curl/curl.h>
21 #include <kvikio/error.hpp>
45 using UniqueHandlePtr = std::unique_ptr<CURL, std::function<decltype(curl_easy_cleanup)>>;
50 std::vector<UniqueHandlePtr> _free_curl_handles{};
82 char _errbuf[CURL_ERROR_SIZE];
83 LibCurl::UniqueHandlePtr _handle;
95 CurlHandle(LibCurl::UniqueHandlePtr
handle, std::string source_file, std::string source_line);
135 template <typename VAL>
136 void setopt(CURLoption option, VAL value)
138 CURLcode err = curl_easy_setopt(
handle(), option, value);
139 if (err != CURLE_OK) {
140 std::stringstream ss;
141 ss <<
"curl_easy_setopt() error "
142 <<
"(" << curl_easy_strerror(err) <<
")";
169 void perform(std::function<
void()>
const& on_retry);
179 template <
typename OUTPUT>
182 CURLcode err = curl_easy_getinfo(
handle(), info, output);
183 if (err != CURLE_OK) {
184 std::stringstream ss;
185 ss <<
"curl_easy_getinfo() error "
186 <<
"(" << curl_easy_strerror(err) <<
")";
207 __attribute__((noinline))
inline std::string fix_conda_file_path_hack(std::string filename)
209 if (filename.data() !=
nullptr) {
return std::string{filename.data()}; }
210 return std::string{};
219 #define create_curl_handle() \
220 kvikio::CurlHandle(kvikio::LibCurl::instance().get_handle(), \
221 kvikio::detail::fix_conda_file_path_hack(__FILE__), \
222 KVIKIO_STRINGIFY(__LINE__))
Representation of a curl easy handle pointer and its operations.
void setopt(CURLoption option, VAL value)
Set option for the curl handle.
CurlHandle(LibCurl::UniqueHandlePtr handle, std::string source_file, std::string source_line)
Construct a new curl handle.
void clear_error_message() noexcept
Discard the recorded error message.
void perform(std::function< void()> const &on_retry)
Perform a blocking network transfer, and if the transfer fails, execute an on_retry callback to roll ...
std::string error_message() const
Get the most recent error message libcurl recorded for this handle.
void getinfo(CURLINFO info, OUTPUT *output)
Extract information from a curl handle.
void perform()
Perform a blocking network transfer using previously set options.
CURL * handle() noexcept
Get the underlying curl easy handle pointer.
Singleton class to initialize and cleanup the global state of libcurl.
UniqueHandlePtr get_free_handle()
Returns a free curl handle if available.
void retain_handle(UniqueHandlePtr handle)
Retain a curl handle for later use.
UniqueHandlePtr get_handle()
Returns a curl handle, create a new handle if none is available.
#define KVIKIO_FAIL(...)
Indicates that an erroneous code path has been taken.