readr

Minimal Terminal RSS Reader
Log | Files | Refs | README | LICENSE

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);
}