10 void CURL_File::error_check(CURLcode code)
14 throw Exception(std::string(
"CURL_File: ") + curl_easy_strerror(code));
18 void CURL_File::perform_range(int64_t start, int64_t size)
const
21 const std::string range =
22 std::to_string(start) +
'-' + std::to_string(start + size - 1);
24 error_check(curl_easy_setopt(curl, CURLOPT_RANGE, range.c_str()));
25 error_check(curl_easy_perform(curl));
28 error_check(curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code));
30 if (code != 0 && code != 206)
31 throw Exception(
"CURL_FIle: unexpected response code: " + std::to_string(code));
35 size_t CURL_File::pread_Callback_Data::copy
42 const size_t copy_size = std::min(size - offset, real_size);
43 std::memcpy(buffer + offset, contents, copy_size);
49 size_t CURL_File::pread_callback
58 const size_t real_size = size * nmemb;
59 pread_Callback_Data &callback_data = *(pread_Callback_Data *)p;
60 return callback_data.copy(
reinterpret_cast<char *
>(contents), real_size);
64 size_t CURL_File::pread(
char *buffer,
size_t size, int64_t offset)
const
67 pread_Callback_Data callback_data{buffer, size, 0};
69 error_check(curl_easy_setopt(curl, CURLOPT_WRITEDATA, &callback_data));
70 error_check(curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, pread_callback));
72 perform_range(offset, int64_t(size));
74 return callback_data.offset;
78 size_t CURL_File::copy_callback
81 void *
const contents,
87 const size_t real_size = size * nmemb;
88 File_Iterator &file_iterator = *((File_Iterator *)p);
89 file_iterator.write((
const char *)contents, real_size);
94 void CURL_File::copy_to
97 Abstract_File &destination,
102 File_Iterator file_iterator(destination);
103 file_iterator.seek(start);
104 error_check(curl_easy_setopt(curl, CURLOPT_WRITEDATA, &file_iterator));
105 error_check(curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, copy_callback));
106 perform_range(start, size);
114 throw Exception(
"Could not initialize CURL");
121 curl_easy_cleanup(
curl);
129 error_check(curl_easy_setopt(
curl, CURLOPT_VERBOSE, verbose));
130 error_check(curl_easy_setopt(
curl, CURLOPT_URL, url));
131 error_check(curl_easy_setopt(
curl, CURLOPT_USERAGENT,
"joedb"));
132 error_check(curl_easy_setopt(
curl, CURLOPT_FOLLOWLOCATION, 1L));
CURL_File(const char *url, bool verbose)
@ read_existing
fails if does not exist