diff options
Diffstat (limited to 'libtmdb/httpClient.cpp')
-rw-r--r-- | libtmdb/httpClient.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/libtmdb/httpClient.cpp b/libtmdb/httpClient.cpp new file mode 100644 index 0000000..93fdd76 --- /dev/null +++ b/libtmdb/httpClient.cpp @@ -0,0 +1,77 @@ +#include "httpClient.h" +#include <boost/foreach.hpp> +#include <boost/lexical_cast.hpp> +#include <curl/curl.h> +#include <tmdb-api.h> + +namespace TMDb { + HttpClient::HttpClient(const std::string & bu, const std::string & k) : + BaseURL(bu), + ApiKey(k) + { + } + + void + HttpClient::packParams(boost::format &) + { + } + + void + HttpClient::appendQueryParameters(std::string & path, const Parameters::value_type & nvp) const + { + path += nvp.first; + path += "="; + auto ev = curl_easy_escape(NULL, nvp.second.value->c_str(), nvp.second.value->size()); + path += ev; + curl_free(ev); + } + + void + HttpClient::appendQueryParameters(std::string & path, const Parameters & parameters) const + { + path += "?"; + appendQueryParameters(path, { "apikey", ApiKey }); + BOOST_FOREACH(const auto & nvp, parameters) { + if (nvp.second.value) { + path += "&"; + appendQueryParameters(path, nvp); + } + } + } + + static size_t + appendString(void * contents, size_t size, size_t nmemb, void * userp) + { + auto data = static_cast<Glib::ustring *>(userp); + data->append(static_cast<const char *>(contents), size * nmemb); + return size * nmemb; + } + + json::Value + HttpClient::FetchJson(const std::string & path) const + { + Glib::ustring jsonData; + + struct curl_slist *headers = NULL; + curl_slist_append(headers, "Accept: application/json"); + + CURL * curl_handle = curl_easy_init(); + curl_easy_setopt(curl_handle, CURLOPT_URL, path.c_str()); + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, appendString); + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&jsonData); + curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); + curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers); + CURLcode res = curl_easy_perform(curl_handle); + + long http_code = 0; + curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &http_code); + curl_easy_cleanup(curl_handle); + if (res != CURLE_OK) { + throw TMDb::HttpException(http_code); + } + + Glib::ustring::const_iterator itr = jsonData.begin(); + return json::parseValue(itr); + } +} + |