readr

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

http.c (1833B)


      1 #include <string.h>
      2 #include <mrss.h>
      3 #include <string.h>
      4 #include <pthread.h>
      5 
      6 #include "http.h"
      7 #include "utils.h"
      8 #include "config.h"
      9 
     10 size_t
     11 http_write(char* ptr, size_t size, size_t nmemb, void* userdata)
     12 {
     13 	size_t n = size * nmemb;
     14 	http_blob* b = userdata;
     15 	char* p = realloc(b->data, b->len + n + 1);
     16 	if (!p) return 0;
     17 	b->data = p;
     18 	memcpy(b->data + b->len, ptr, n);
     19 	b->len += n;
     20 	b->data[b->len] = '\0';
     21 	return n;
     22 }
     23 
     24 void* /* http contents */
     25 threaded_fetch(void* url)
     26 {
     27 	char curl_errbuf[CURL_ERROR_SIZE];
     28 	CURL* curl = curl_easy_init();
     29 	if (!curl) { return NULL; }
     30 
     31 	http_blob* blob = ecalloc(1, sizeof *blob);
     32 	if (!blob) {
     33 		curl_easy_cleanup(curl);
     34 		return NULL;
     35 	}
     36 
     37 	curl_easy_setopt(curl, CURLOPT_URL, (char*)url);
     38 	curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf);
     39 	curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
     40 	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, VERIFY_SSL_PEER ? 1L : 0L);
     41 	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, VERIFY_SSL_HOST ? 1L : 0L);
     42 
     43 	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_write);
     44 	curl_easy_setopt(curl, CURLOPT_WRITEDATA, blob);
     45 	curl_easy_setopt(curl, CURLOPT_USERAGENT, USER_AGENT);
     46 	curl_easy_setopt(curl, CURLOPT_TIMEOUT, TIMEOUT);
     47 
     48 	CURLcode res = curl_easy_perform(curl);
     49 	if (res != CURLE_OK) {
     50 		fprintf(stderr,
     51 			"\nFAILED loading URL: %s -- %s\n\n",
     52 			(char*)url,
     53 			curl_errbuf[0] ? curl_errbuf : curl_easy_strerror(res));
     54 		free(blob->data);
     55 		free(blob);
     56 		curl_easy_cleanup(curl);
     57 		return NULL;
     58 	}
     59 
     60 	curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &blob->status);
     61 	char* ct = NULL;
     62 	if (curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct) == CURLE_OK && ct) {
     63 		blob->ctype = strdup(ct);
     64 	}
     65 
     66 	curl_easy_cleanup(curl);
     67 	return blob;
     68 }
     69 
     70 void
     71 http_blob_free(http_blob* b)
     72 {
     73 	if (!b) return;
     74 	free(b->data);
     75 	free(b->ctype);
     76 	free(b);
     77 }