#include "http_get.h" // Callback for libcurl to write response into our struct static size_t write_callback(void *data, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; struct Memory *mem = (struct Memory *)userp; char *ptr = realloc(mem->response, mem->size + realsize + 1); if(ptr == NULL) { // Out of memory! fprintf(stderr, "realloc() failed\n"); return 0; } mem->response = ptr; memcpy(&(mem->response[mem->size]), data, realsize); mem->size += realsize; mem->response[mem->size] = '\0'; return realsize; } // Function: GET request, returns heap string (caller must free) char *http_get(const char *url) { CURL *curl; CURLcode res; struct Memory chunk; chunk.response = malloc(1); // start with empty buffer chunk.size = 0; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); // follow redirects curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); free(chunk.response); chunk.response = NULL; } curl_easy_cleanup(curl); } curl_global_cleanup(); return chunk.response; }