1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #include "curl.h"
- // Borrowed from https://curl.haxx.se/libcurl/c/getinmemory.html
- static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
- size_t realsize = size * nmemb;
- struct MemoryStruct *mem = (struct MemoryStruct *)userp;
-
- mem->memory = realloc(mem->memory, mem->size + realsize + 1);
- if(mem->memory == NULL)
- return 0;
-
- memcpy(&(mem->memory[mem->size]), contents, realsize);
- mem->size += realsize;
- mem->memory[mem->size] = 0;
-
- return realsize;
- }
- char *getData(char *url) {
- CURL *curl_handle;
- CURLcode res;
-
- struct MemoryStruct chunk;
-
- chunk.memory = malloc(1); /* will be grown as needed by the realloc above */
- chunk.size = 0; /* no data at this point */
-
- curl_global_init(CURL_GLOBAL_ALL);
-
- /* init the curl session */
- curl_handle = curl_easy_init();
-
- /* specify URL to get */
- curl_easy_setopt(curl_handle, CURLOPT_URL, url);
- curl_easy_setopt(curl_handle, CURLOPT_NOPROXY, "*");
-
- /* send all data to this function */
- curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
-
- /* we pass our 'chunk' struct to the callback function */
- curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
-
- /* some servers don't like requests that are made without a user-agent
- field, so we provide one */
- curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
-
- /* get it! */
- res = curl_easy_perform(curl_handle);
-
- /* check for errors */
- if(res != CURLE_OK) {
- fprintf(stderr, "curl_easy_perform() failed: %s\n",
- curl_easy_strerror(res));
- }
- size_t dataSize = strlen(chunk.memory);
- char *data = calloc(dataSize + 1, 1);
- data = strncpy(data, chunk.memory, dataSize);
-
- /* cleanup curl stuff */
- curl_easy_cleanup(curl_handle);
-
- free(chunk.memory);
-
- /* we're done with libcurl, so clean it up */
- curl_global_cleanup();
-
- return data;
- }
|