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 }