http.c (1833B)
#include <string.h>
#include <mrss.h>
#include <string.h>
#include <pthread.h>
#include "http.h"
#include "utils.h"
#include "config.h"
size_t
http_write(char* ptr, size_t size, size_t nmemb, void* userdata)
{
size_t n = size * nmemb;
http_blob* b = userdata;
char* p = realloc(b->data, b->len + n + 1);
if (!p) return 0;
b->data = p;
memcpy(b->data + b->len, ptr, n);
b->len += n;
b->data[b->len] = '\0';
return n;
}
void* /* http contents */
threaded_fetch(void* url)
{
char curl_errbuf[CURL_ERROR_SIZE];
CURL* curl = curl_easy_init();
if (!curl) { return NULL; }
http_blob* blob = ecalloc(1, sizeof *blob);
if (!blob) {
curl_easy_cleanup(curl);
return NULL;
}
curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, VERIFY_SSL_PEER ? 1L : 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, VERIFY_SSL_HOST ? 1L : 0L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_write);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, blob);
curl_easy_setopt(curl, CURLOPT_USERAGENT, USER_AGENT);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, TIMEOUT);
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr,
"\nFAILED loading URL: %s -- %s\n\n",
(char*)url,
curl_errbuf[0] ? curl_errbuf : curl_easy_strerror(res));
free(blob->data);
free(blob);
curl_easy_cleanup(curl);
return NULL;
}
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &blob->status);
char* ct = NULL;
if (curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct) == CURLE_OK && ct) {
blob->ctype = strdup(ct);
}
curl_easy_cleanup(curl);
return blob;
}
void
http_blob_free(http_blob* b)
{
if (!b) return;
free(b->data);
free(b->ctype);
free(b);
}