| @@ -1,4 +1,5 @@ | |||||
| #include <network.hpp> | #include <network.hpp> | ||||
| #include <asset.hpp> | |||||
| #define CURL_STATICLIB | #define CURL_STATICLIB | ||||
| #include <curl/curl.h> | #include <curl/curl.h> | ||||
| @@ -7,6 +8,20 @@ namespace rack { | |||||
| namespace network { | namespace network { | ||||
| static CURL *createCurl() { | |||||
| CURL *curl = curl_easy_init(); | |||||
| assert(curl); | |||||
| // curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | |||||
| curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); | |||||
| std::string caPath = asset::system("cacert.pem"); | |||||
| curl_easy_setopt(curl, CURLOPT_CAINFO, caPath.c_str()); | |||||
| return curl; | |||||
| } | |||||
| static size_t writeStringCallback(char *ptr, size_t size, size_t nmemb, void *userdata) { | static size_t writeStringCallback(char *ptr, size_t size, size_t nmemb, void *userdata) { | ||||
| std::string *str = (std::string*) userdata; | std::string *str = (std::string*) userdata; | ||||
| size_t len = size * nmemb; | size_t len = size * nmemb; | ||||
| @@ -16,9 +31,7 @@ static size_t writeStringCallback(char *ptr, size_t size, size_t nmemb, void *us | |||||
| json_t *requestJson(Method method, std::string url, json_t *dataJ) { | json_t *requestJson(Method method, std::string url, json_t *dataJ) { | ||||
| CURL *curl = curl_easy_init(); | |||||
| assert(curl); | |||||
| CURL *curl = createCurl(); | |||||
| char *reqStr = NULL; | char *reqStr = NULL; | ||||
| // Process data | // Process data | ||||
| @@ -82,8 +95,6 @@ json_t *requestJson(Method method, std::string url, json_t *dataJ) { | |||||
| curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resText); | curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resText); | ||||
| // Perform request | // Perform request | ||||
| // DEBUG("Requesting %s", url.c_str()); | |||||
| // curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); | |||||
| CURLcode res = curl_easy_perform(curl); | CURLcode res = curl_easy_perform(curl); | ||||
| // Cleanup | // Cleanup | ||||
| @@ -114,22 +125,18 @@ static int xferInfoCallback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, | |||||
| } | } | ||||
| bool requestDownload(std::string url, const std::string &filename, float *progress) { | bool requestDownload(std::string url, const std::string &filename, float *progress) { | ||||
| CURL *curl = curl_easy_init(); | |||||
| if (!curl) | |||||
| return false; | |||||
| CURL *curl = createCurl(); | |||||
| FILE *file = fopen(filename.c_str(), "wb"); | FILE *file = fopen(filename.c_str(), "wb"); | ||||
| if (!file) | if (!file) | ||||
| return false; | return false; | ||||
| curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); | curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); | ||||
| curl_easy_setopt(curl, CURLOPT_VERBOSE, false); | |||||
| curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false); | curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false); | ||||
| curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); | curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); | ||||
| curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); | curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); | ||||
| curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferInfoCallback); | curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferInfoCallback); | ||||
| curl_easy_setopt(curl, CURLOPT_XFERINFODATA, progress); | curl_easy_setopt(curl, CURLOPT_XFERINFODATA, progress); | ||||
| curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); | |||||
| // Fail on 4xx and 5xx HTTP codes | // Fail on 4xx and 5xx HTTP codes | ||||
| curl_easy_setopt(curl, CURLOPT_FAILONERROR, true); | curl_easy_setopt(curl, CURLOPT_FAILONERROR, true); | ||||