| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630 |
- #include <fstream>
- #include <sstream>
- #include <boost/algorithm/string.hpp>
- #include <curl/curl.h>
- #include <openssl/crypto.h>
- #include "HttpClientHelpers.h"
- #include "HttpClient.h"
- namespace PresenceDetection {
- namespace Util {
- HttpClient::HttpClient()
- {
- curl_global_init(CURL_GLOBAL_ALL);
- m_userAgents.push_back("Opera/9.80 (X11; Linux i686; U; en) Presto/2.7.62 Version/11.00");
- InitializeLocks();
- }
- HttpClient::~HttpClient()
- {
- FreeLocks();
- curl_global_cleanup();
- }
- std::string HttpClient::GetUrlContents(const std::string& url) const
- {
- std::string buffer;
- CURL* curl = curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
- curl_easy_setopt(curl, CURLOPT_USERAGENT, m_userAgents[rand() % m_userAgents.size()].c_str());
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- error << "Data: " << buffer;
- throw std::runtime_error(error.str());
- }
- return buffer;
- }
- void HttpClient::GetUrlSilent(const std::string& url) const
- {
- CURL* curl = curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
- curl_easy_setopt(curl, CURLOPT_USERAGENT, m_userAgents[rand() % m_userAgents.size()].c_str());
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, nullptr);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- throw std::runtime_error(error.str());
- }
- }
- std::string HttpClient::GetUrlContents(const std::string& url, const std::string& cookieFile) const
- {
- std::string buffer;
- CURL* curl = curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
- curl_easy_setopt(curl, CURLOPT_USERAGENT, m_userAgents[rand() % m_userAgents.size()].c_str());
- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_COOKIEJAR, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- error << "Data: " << buffer;
- throw std::runtime_error(error.str());
- }
- return buffer;
- }
- void HttpClient::GetUrlSilent(const std::string& url, const std::string& cookieFile) const
- {
- CURL* curl = curl_easy_init();
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
- curl_easy_setopt(curl, CURLOPT_USERAGENT, m_userAgents[rand() % m_userAgents.size()].c_str());
- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_COOKIEJAR, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, nullptr);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- throw std::runtime_error(error.str());
- }
- }
- std::string HttpClient::GetUrlPostContents(const std::string& url, const std::string& postData, const std::string& contentType) const
- {
- std::string buffer;
- CURL* curl = curl_easy_init();
- std::stringstream contentTypeString;
- contentTypeString << "Content-Type: " << contentType;
- struct curl_slist *list = NULL;
- list = curl_slist_append(list, contentTypeString.str().c_str());
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
- curl_easy_setopt(curl, CURLOPT_USERAGENT, m_userAgents[rand() % m_userAgents.size()].c_str());
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
- curl_easy_setopt(curl, CURLOPT_POST, 1);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.c_str());
- curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, postData.size());
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- error << "Data: " << buffer;
- throw std::runtime_error(error.str());
- }
- return buffer;
- }
- void HttpClient::GetUrlPostSilent(const std::string& url, const std::string& postData, const std::string& contentType) const
- {
- CURL* curl = curl_easy_init();
- std::stringstream contentTypeString;
- contentTypeString << "Content-Type: " << contentType;
- struct curl_slist *list = NULL;
- list = curl_slist_append(list, contentTypeString.str().c_str());
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
- curl_easy_setopt(curl, CURLOPT_USERAGENT, m_userAgents[rand() % m_userAgents.size()].c_str());
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
- curl_easy_setopt(curl, CURLOPT_POST, 1);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.c_str());
- curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, postData.size());
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, nullptr);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- throw std::runtime_error(error.str());
- }
- }
- std::string HttpClient::GetUrlPostContents(const std::string& url, const std::string& cookieFile, const std::string& postData, const std::string& contentType) const
- {
- std::string buffer;
- CURL* curl = curl_easy_init();
- std::stringstream contentTypeString;
- contentTypeString << "Content-Type: " << contentType;
- struct curl_slist *list = NULL;
- list = curl_slist_append(list, contentTypeString.str().c_str());
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
- curl_easy_setopt(curl, CURLOPT_USERAGENT, m_userAgents[rand() % m_userAgents.size()].c_str());
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
- curl_easy_setopt(curl, CURLOPT_POST, 1);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.c_str());
- curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, postData.size());
- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_COOKIEJAR, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- error << "Data: " << buffer;
- throw std::runtime_error(error.str());
- }
- return buffer;
- }
- void HttpClient::GetUrlPostSilent(const std::string& url, const std::string& cookieFile, const std::string& postData, const std::string& contentType) const
- {
- CURL* curl = curl_easy_init();
- std::stringstream contentTypeString;
- contentTypeString << "Content-Type: " << contentType;
- struct curl_slist *list = NULL;
- list = curl_slist_append(list, contentTypeString.str().c_str());
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
- curl_easy_setopt(curl, CURLOPT_USERAGENT, m_userAgents[rand() % m_userAgents.size()].c_str());
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
- curl_easy_setopt(curl, CURLOPT_POST, 1);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData.c_str());
- curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, postData.size());
- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_COOKIEJAR, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, nullptr);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- throw std::runtime_error(error.str());
- }
- }
- std::string HttpClient::GetUrlPostAttachmentContents(const std::string& url, const std::string& postData, const std::string& filename, const std::string& fileFieldname) const
- {
- std::string buffer;
- std::string contents;
- std::ifstream fileStream(filename, std::ios::in | std::ios::binary);
- if (fileStream)
- {
- fileStream.seekg(0, std::ios::end);
- contents.resize(fileStream.tellg());
- fileStream.seekg(0, std::ios::beg);
- fileStream.read(&contents[0], contents.size());
- fileStream.close();
- }
- CURL* curl = curl_easy_init();
- CURLcode result;
- struct curl_httppost *formpost = nullptr;
- struct curl_httppost *lastptr = nullptr;
- struct curl_slist *headerlist = nullptr;
- static const char headerBuffer[] = "Expect:";
- curl_global_init(CURL_GLOBAL_ALL);
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, "cache-control:",
- CURLFORM_COPYCONTENTS, "no-cache",
- CURLFORM_END);
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, "content-type:",
- CURLFORM_COPYCONTENTS, "multipart/form-data",
- CURLFORM_END);
- std::vector<std::string> postTokens;
- boost::split(postTokens, postData, boost::is_any_of("&"));
- for (std::vector<std::string>::iterator it = postTokens.begin(); it != postTokens.end(); ++it)
- {
- std::vector<std::string> tokens;
- boost::split(tokens, *it, boost::is_any_of("="));
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, tokens[0].c_str(),
- CURLFORM_COPYCONTENTS, tokens[1].c_str(),
- CURLFORM_END);
- }
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, fileFieldname.c_str(),
- CURLFORM_BUFFER, "data",
- CURLFORM_BUFFERPTR, contents.data(),
- CURLFORM_BUFFERLENGTH, contents.size(),
- CURLFORM_END);
- headerlist = curl_slist_append(headerlist, headerBuffer);
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- curl_formfree(formpost);
- curl_slist_free_all(headerlist);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- error << "Data: " << buffer;
- throw std::runtime_error(error.str());
- }
- return buffer;
- }
- void HttpClient::GetUrlPostAttachmentSilent(const std::string& url, const std::string& postData, const std::string& filename, const std::string& fileFieldname) const
- {
- std::string contents;
- std::ifstream fileStream(filename, std::ios::in | std::ios::binary);
- if (fileStream)
- {
- fileStream.seekg(0, std::ios::end);
- contents.resize(fileStream.tellg());
- fileStream.seekg(0, std::ios::beg);
- fileStream.read(&contents[0], contents.size());
- fileStream.close();
- }
- CURL* curl = curl_easy_init();
- CURLcode result;
- struct curl_httppost *formpost = nullptr;
- struct curl_httppost *lastptr = nullptr;
- struct curl_slist *headerlist = nullptr;
- static const char headerBuffer[] = "Expect:";
- curl_global_init(CURL_GLOBAL_ALL);
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, "cache-control:",
- CURLFORM_COPYCONTENTS, "no-cache",
- CURLFORM_END);
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, "content-type:",
- CURLFORM_COPYCONTENTS, "multipart/form-data",
- CURLFORM_END);
- std::vector<std::string> postTokens;
- boost::split(postTokens, postData, boost::is_any_of("&"));
- for (std::vector<std::string>::iterator it = postTokens.begin(); it != postTokens.end(); ++it)
- {
- std::vector<std::string> tokens;
- boost::split(tokens, *it, boost::is_any_of("="));
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, tokens[0].c_str(),
- CURLFORM_COPYCONTENTS, tokens[1].c_str(),
- CURLFORM_END);
- }
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, fileFieldname.c_str(),
- CURLFORM_BUFFER, "data",
- CURLFORM_BUFFERPTR, contents.data(),
- CURLFORM_BUFFERLENGTH, contents.size(),
- CURLFORM_END);
- headerlist = curl_slist_append(headerlist, headerBuffer);
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- curl_formfree(formpost);
- curl_slist_free_all(headerlist);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- throw std::runtime_error(error.str());
- }
- }
- std::string HttpClient::GetUrlPostAttachmentContents(const std::string& url, const std::string& cookieFile, const std::string& postData, const std::string& filename, const std::string& fileFieldname) const
- {
- std::string buffer;
- std::string contents;
- std::ifstream fileStream(filename, std::ios::in | std::ios::binary);
- if (fileStream)
- {
- fileStream.seekg(0, std::ios::end);
- contents.resize(fileStream.tellg());
- fileStream.seekg(0, std::ios::beg);
- fileStream.read(&contents[0], contents.size());
- fileStream.close();
- }
- CURL* curl = curl_easy_init();
- CURLcode result;
- struct curl_httppost *formpost = nullptr;
- struct curl_httppost *lastptr = nullptr;
- struct curl_slist *headerlist = nullptr;
- static const char headerBuffer[] = "Expect:";
- curl_global_init(CURL_GLOBAL_ALL);
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, "cache-control:",
- CURLFORM_COPYCONTENTS, "no-cache",
- CURLFORM_END);
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, "content-type:",
- CURLFORM_COPYCONTENTS, "multipart/form-data",
- CURLFORM_END);
- std::vector<std::string> postTokens;
- boost::split(postTokens, postData, boost::is_any_of("&"));
- for (std::vector<std::string>::iterator it = postTokens.begin(); it != postTokens.end(); ++it)
- {
- std::vector<std::string> tokens;
- boost::split(tokens, *it, boost::is_any_of("="));
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, tokens[0].c_str(),
- CURLFORM_COPYCONTENTS, tokens[1].c_str(),
- CURLFORM_END);
- }
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, fileFieldname.c_str(),
- CURLFORM_BUFFER, "data",
- CURLFORM_BUFFERPTR, contents.data(),
- CURLFORM_BUFFERLENGTH, contents.size(),
- CURLFORM_END);
- headerlist = curl_slist_append(headerlist, headerBuffer);
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_COOKIEJAR, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &WriteCallback);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- curl_formfree(formpost);
- curl_slist_free_all(headerlist);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- error << "Data: " << buffer;
- throw std::runtime_error(error.str());
- }
- return buffer;
- }
- void HttpClient::GetUrlPostAttachmentSilent(const std::string& url, const std::string& cookieFile, const std::string& postData, const std::string& filename, const std::string& fileFieldname) const
- {
- std::string contents;
- std::ifstream fileStream(filename, std::ios::in | std::ios::binary);
- if (fileStream)
- {
- fileStream.seekg(0, std::ios::end);
- contents.resize(fileStream.tellg());
- fileStream.seekg(0, std::ios::beg);
- fileStream.read(&contents[0], contents.size());
- fileStream.close();
- }
- CURL* curl = curl_easy_init();
- CURLcode result;
- struct curl_httppost *formpost = nullptr;
- struct curl_httppost *lastptr = nullptr;
- struct curl_slist *headerlist = nullptr;
- static const char headerBuffer[] = "Expect:";
- curl_global_init(CURL_GLOBAL_ALL);
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, "cache-control:",
- CURLFORM_COPYCONTENTS, "no-cache",
- CURLFORM_END);
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, "content-type:",
- CURLFORM_COPYCONTENTS, "multipart/form-data",
- CURLFORM_END);
- std::vector<std::string> postTokens;
- boost::split(postTokens, postData, boost::is_any_of("&"));
- for (std::vector<std::string>::iterator it = postTokens.begin(); it != postTokens.end(); ++it)
- {
- std::vector<std::string> tokens;
- boost::split(tokens, *it, boost::is_any_of("="));
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, tokens[0].c_str(),
- CURLFORM_COPYCONTENTS, tokens[1].c_str(),
- CURLFORM_END);
- }
- curl_formadd(&formpost, &lastptr,
- CURLFORM_COPYNAME, fileFieldname.c_str(),
- CURLFORM_BUFFER, "data",
- CURLFORM_BUFFERPTR, contents.data(),
- CURLFORM_BUFFERLENGTH, contents.size(),
- CURLFORM_END);
- headerlist = curl_slist_append(headerlist, headerBuffer);
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, cookieFile.c_str());
- curl_easy_setopt(curl, CURLOPT_COOKIEJAR, cookieFile.c_str());
- int code = 0;
- curl_easy_perform(curl);
- curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
- curl_easy_cleanup(curl);
- curl_formfree(formpost);
- curl_slist_free_all(headerlist);
- if (code != 200)
- {
- std::stringstream error;
- error << "Error (" << code << ") encountered while retrieving " << url << "\n";
- throw std::runtime_error(error.str());
- }
- }
- size_t HttpClient::WriteCallback(char* data, size_t size, size_t nmemb, std::string* writerData)
- {
- if (writerData == nullptr)
- return size * nmemb;
- writerData->append(data, size * nmemb);
- return size * nmemb;
- }
- } // namespace Util
- } // namespace PresenceDetection
|