Last active
September 24, 2023 06:42
-
-
Save ericdke/7c95c5839ffb2081e2a05ca6b08582bc to your computer and use it in GitHub Desktop.
C++: Download a file using HTTP GET and store in in a std::string
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* HTTPDownloader.hpp | |
* | |
* A simple C++ wrapper for the libcurl easy API. | |
* | |
* Written by Uli Köhler (techoverflow.net) | |
* Published under CC0 1.0 Universal (public domain) | |
*/ | |
#ifndef HTTPDOWNLOADER_HPP | |
#define HTTPDOWNLOADER_HPP | |
#include <string> | |
#include <curl/curl.h> | |
#include <curl/easy.h> | |
#include <curl/curlbuild.h> | |
#include <sstream> | |
#include <iostream> | |
/** | |
* A non-threadsafe simple libcURL-easy based HTTP downloader | |
*/ | |
class HTTPDownloader { | |
public: | |
HTTPDownloader(); | |
~HTTPDownloader(); | |
/** | |
* Download a file using HTTP GET and store in in a std::string | |
* @param url The URL to download | |
* @return The download result | |
*/ | |
std::string download(const std::string& url); | |
private: | |
void* curl; | |
}; | |
#endif /* HTTPDOWNLOADER_HPP */ | |
/** | |
* HTTPDownloader.cpp | |
* | |
* A simple C++ wrapper for the libcurl easy API. | |
* | |
* Written by Uli Köhler (techoverflow.net) | |
* Published under CC0 1.0 Universal (public domain) | |
*/ | |
#include "Downloader.hpp" | |
using namespace std; | |
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) { | |
string data((const char*) ptr, (size_t) size * nmemb); | |
*((stringstream*) stream) << data << endl; | |
return size * nmemb; | |
} | |
HTTPDownloader::HTTPDownloader() { | |
curl = curl_easy_init(); | |
} | |
HTTPDownloader::~HTTPDownloader() { | |
curl_easy_cleanup(curl); | |
} | |
string HTTPDownloader::download(const std::string& url) { | |
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); | |
/* we tell libcurl to follow redirection */ | |
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); | |
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); //Prevent "longjmp causes uninitialized stack frame" bug | |
curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "deflate"); | |
std::stringstream out; | |
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); | |
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out); | |
/* Perform the request, res will get the return code */ | |
CURLcode res = curl_easy_perform(curl); | |
/* Check for errors */ | |
if (res != CURLE_OK) { | |
fprintf(stderr, "curl_easy_perform() failed: %s\n", | |
curl_easy_strerror(res)); | |
} | |
return out.str(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment