polybar/src/utils/http.cpp

52 lines
1.4 KiB
C++
Raw Normal View History

#include <curl/curl.h>
#include <curl/curlbuild.h>
#include <curl/easy.h>
#include <iostream>
#include <sstream>
#include "errors.hpp"
#include "utils/http.hpp"
POLYBAR_NS
http_downloader::http_downloader(int connection_timeout) {
m_curl = curl_easy_init();
curl_easy_setopt(m_curl, CURLOPT_ACCEPT_ENCODING, "deflate");
curl_easy_setopt(m_curl, CURLOPT_CONNECTTIMEOUT, connection_timeout);
curl_easy_setopt(m_curl, CURLOPT_FOLLOWLOCATION, true);
curl_easy_setopt(m_curl, CURLOPT_NOSIGNAL, true);
curl_easy_setopt(m_curl, CURLOPT_USERAGENT, "polybar/" GIT_TAG);
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, http_downloader::write);
}
http_downloader::~http_downloader() {
curl_easy_cleanup(m_curl);
}
string http_downloader::get(const string& url) {
stringstream out{};
curl_easy_setopt(m_curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &out);
auto res = curl_easy_perform(m_curl);
if (res != CURLE_OK) {
throw application_error(curl_easy_strerror(res), res);
}
return out.str();
}
long http_downloader::response_code() {
long code{0};
curl_easy_getinfo(m_curl, CURLINFO_RESPONSE_CODE, &code);
return code;
}
size_t http_downloader::write(void* p, size_t size, size_t bytes, void* stream) {
string data{static_cast<const char*>(p), size * bytes};
*(static_cast<stringstream*>(stream)) << data << '\n';
return size * bytes;
}
POLYBAR_NS_END