118WriteMemoryCallback(
void *contents,
size_t size,
size_t nmemb,
void *userp)
120 size_t realsize = size * nmemb;
121 struct MemoryStruct *mem = (
struct MemoryStruct *)userp;
123 char *ptr = realloc(mem->memory, mem->size + realsize + 1);
126 cpl_error_set_message(cpl_func, CPL_ERROR_UNSPECIFIED,
127 "Not enough memory (realloc returned NULL)");
133 memcpy(&(mem->memory[mem->size]), contents, realsize);
134 mem->size += realsize;
135 mem->memory[mem->size] = 0;
164 cpl_ensure (url, CPL_ERROR_NULL_INPUT, NULL);
165 cpl_ensure (data_length, CPL_ERROR_NULL_INPUT, NULL);
167 cpl_msg_debug (cpl_func,
"Using URL %s", url);
174 struct MemoryStruct chunk;
176 chunk.memory = malloc(1);
179 curl_global_init(CURL_GLOBAL_ALL);
182 curl_handle = curl_easy_init();
185 curl_easy_setopt(curl_handle, CURLOPT_URL, url);
195 curl_easy_setopt(curl_handle, CURLOPT_FAILONERROR, 1L);
197 if(cpl_msg_get_level() == CPL_MSG_DEBUG){
199 curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
201 curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
205 curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
208 curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (
void *)&chunk);
212 curl_easy_setopt(curl_handle, CURLOPT_USERAGENT,
"libcurl-agent/1.0");
215 res = curl_easy_perform(curl_handle);
218 if(res != CURLE_OK) {
222 cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
223 "Could not retrieve data: %s",curl_easy_strerror(res));
224 curl_easy_cleanup(curl_handle);
225 curl_global_cleanup();
237 *data_length = chunk.size;
238 curl_easy_cleanup(curl_handle);
239 curl_global_cleanup();
250static size_t write_data(
void *ptr,
size_t size,
size_t nmemb,
void *stream)
252 size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
281 cpl_ensure_code(url, CPL_ERROR_NULL_INPUT);
282 cpl_ensure_code(filename, CPL_ERROR_NULL_INPUT);
284 cpl_msg_debug (cpl_func,
"Using URL %s", url);
285 cpl_msg_debug (cpl_func,
"Using File %s", filename);
291 curl_global_init(CURL_GLOBAL_ALL);
294 curl_handle = curl_easy_init();
297 curl_easy_setopt(curl_handle, CURLOPT_URL, url);
307 curl_easy_setopt(curl_handle, CURLOPT_FAILONERROR, 1L);
309 if(cpl_msg_get_level() == CPL_MSG_DEBUG){
311 curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
313 curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
317 curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
320 pagefile = fopen(filename,
"wb");
325 curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile);
328 res = curl_easy_perform(curl_handle);
330 if(res != CURLE_OK) {
331 curl_easy_cleanup(curl_handle);
332 curl_global_cleanup();
335 return cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
336 "Could not retrieve data: %s",
337 curl_easy_strerror(res));
344 curl_easy_cleanup(curl_handle);
345 curl_global_cleanup();
346 return cpl_error_set_message(cpl_func, CPL_ERROR_FILE_NOT_CREATED,
347 "The file %s could not be created",
352 curl_easy_cleanup(curl_handle);
353 curl_global_cleanup();
355 return cpl_error_get_code();
cpl_error_code hdrl_download_url_to_file(const char *url, const char *filename)
Downloads a url into a file on disc.
char * hdrl_download_url_to_buffer(const char *url, size_t *data_length)
Downloads a url into a c data buffer.