aboutsummaryrefslogtreecommitdiff
path: root/src/curl.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2017-12-12 17:33:03 +0100
committerdec05eba <dec05eba@protonmail.com>2017-12-12 17:34:16 +0100
commitf3b7b7d34b3bf2b1be18914577c96b66dead379a (patch)
treef24a08256bc959929d51045eb49283fcab7e8b54 /src/curl.cpp
parentcfe578ec12198d09a9a89a2e0b40bccaa06aa8ae (diff)
Download and extract missing dependencies from github
Using libcurl and libarchive
Diffstat (limited to 'src/curl.cpp')
-rw-r--r--src/curl.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/curl.cpp b/src/curl.cpp
new file mode 100644
index 0000000..f39cab8
--- /dev/null
+++ b/src/curl.cpp
@@ -0,0 +1,87 @@
+#include "../include/curl.hpp"
+#include "../include/env.hpp"
+#include <curl/curl.h>
+#include <cstring>
+
+using namespace std;
+
+#ifdef DEBUG
+#define CURL_DEBUG
+#endif
+
+#undef CURL_DEBUG
+
+class CurlSession
+{
+public:
+ CurlSession()
+ {
+ curl_global_init(CURL_GLOBAL_ALL);
+ }
+};
+
+static CurlSession curlSession;
+
+namespace sibs
+{
+ // TODO: Instead of writing to file, reading from file and extracting it;
+ // we can extract to file directly by putting libarchive code here
+ size_t writeToFile(void *ptr, size_t size, size_t nmemb, void *stream)
+ {
+ return fwrite(ptr, size, nmemb, (FILE*)stream);
+ }
+
+ Result<bool> curl::downloadFile(const char *url, const char *filepath)
+ {
+ CURL *curl_handle = curl_easy_init();
+ curl_easy_setopt(curl_handle, CURLOPT_URL, url);
+#ifdef CURL_DEBUG
+ long verbose = 1L;
+ long noProgressMeter = 0L;
+#else
+ long verbose = 0L;
+ long noProgressMeter = 1L;
+#endif
+ curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, verbose);
+ curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, noProgressMeter);
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, writeToFile);
+ curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, true);
+
+ FILE *file = fopen(filepath, "wb");
+ if(!file)
+ {
+ int error = errno;
+ curl_easy_cleanup(curl_handle);
+
+ string errMsg = "Failed to open file for writing: ";
+ errMsg += filepath;
+ if(error != 0)
+ {
+ errMsg += "; Reason: ";
+ errMsg += strerror(error);
+ return Result<bool>::Err(errMsg);
+ }
+ else
+ {
+ return Result<bool>::Err(errMsg);
+ }
+ }
+
+ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, file);
+ printf("Downloading from url: %s\n", url);
+ CURLcode curlResponse = curl_easy_perform(curl_handle);
+ curl_easy_cleanup(curl_handle);
+ fclose(file);
+
+ if(curlResponse != CURLE_OK)
+ {
+ string errMsg = "Failed to download file from url: ";
+ errMsg += url;
+ errMsg += "\nReason: ";
+ errMsg += curl_easy_strerror(curlResponse);
+ return Result<bool>::Err(errMsg);
+ }
+
+ return Result<bool>::Ok(true);
+ }
+} \ No newline at end of file