generated from AfonsoCMSousa/CPP-Template
55 lines
1.5 KiB
C
55 lines
1.5 KiB
C
#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;
|
|
}
|
|
|