std::string engine::perform() { CURLcode res = curl_easy_perform(m_curl); if (res != CURLE_OK) { throw curl_error(std::string(curl_easy_strerror(res))); } std::string r = s_data; s_data.clear(); return r; }
void engine::init_curl(std::string key, report_level s, validate_cert v) { if (m_curl != 0) { curl_easy_cleanup(m_curl); } m_curl = curl_easy_init(); if (m_curl == 0) { throw curl_error("Failed to initialize CURL"); } curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, &data_get); curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, 0); if (!key.empty()) { key += ":x"; curl_easy_setopt(m_curl, CURLOPT_USERPWD, key.c_str()); } if (v == NOT_VALIDATE) { curl_easy_setopt(m_curl, CURLOPT_SSL_VERIFYPEER, false); } if (s == VERBOSE) { curl_easy_setopt(m_curl, CURLOPT_VERBOSE, 1L); } }
std::string engine::get_api_key(std::string server, const std::string& user, const std::string& password, report_level s, validate_cert v) { if (m_curl == 0) { m_curl = curl_easy_init(); } if (m_curl == 0) { throw curl_error("Failed to initialize CURL"); } curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, &data_get); curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, 0); if (v == NOT_VALIDATE) { curl_easy_setopt(m_curl, CURLOPT_SSL_VERIFYPEER, false); } if (s == VERBOSE) { curl_easy_setopt(m_curl, CURLOPT_VERBOSE, 1L); } server += "/login"; curl_easy_setopt(m_curl, CURLOPT_URL, server.c_str()); curl_header_guard hg(m_curl); std::string data = std::string( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\ <user>\ <email>") + user + std::string("</email>\ <password>") + password + std::string("</password>\ "); data += "</user>\n"; curl_easy_setopt(m_curl, CURLOPT_HTTPPOST, 0); curl_easy_setopt(m_curl, CURLOPT_POSTFIELDS, data.c_str()); if (s >= NORMAL) { io::mout << "Getting API key for user '" << user << "'" << io::endl; } return process_get_api_key_responce(perform(), s); }
void Http::priv::http_perform() { ::curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); ::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writecb); ::curl_easy_setopt(curl, CURLOPT_WRITEDATA, static_cast<void*>(this)); ::curl_easy_setopt(curl, CURLOPT_READFUNCTION, form_file_read_cb); ::curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L); #if LIBCURL_VERSION_MAJOR >= 7 && LIBCURL_VERSION_MINOR >= 32 ::curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xfercb); ::curl_easy_setopt(curl, CURLOPT_XFERINFODATA, static_cast<void*>(this)); #ifndef _WIN32 (void)xfercb_legacy; // prevent unused function warning #endif #else ::curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, xfercb); ::curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, static_cast<void*>(this)); #endif ::curl_easy_setopt(curl, CURLOPT_VERBOSE, get_logging_level() >= 4); if (headerlist != nullptr) { ::curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); } if (form != nullptr) { ::curl_easy_setopt(curl, CURLOPT_HTTPPOST, form); } if (!postfields.empty()) { ::curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postfields.c_str()); ::curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, postfields.size()); } CURLcode res = ::curl_easy_perform(curl); if (res != CURLE_OK) { if (res == CURLE_ABORTED_BY_CALLBACK) { if (cancel) { // The abort comes from the request being cancelled programatically Progress dummyprogress(0, 0, 0, 0); bool cancel = true; if (progressfn) { progressfn(dummyprogress, cancel); } } else { // The abort comes from the CURLOPT_READFUNCTION callback, which means reading file failed if (errorfn) { errorfn(std::move(buffer), "Error reading file for file upload", 0); } } } else if (res == CURLE_WRITE_ERROR) { if (errorfn) { errorfn(std::move(buffer), body_size_error(), 0); } } else { if (errorfn) { errorfn(std::move(buffer), curl_error(res), 0); } }; } else { long http_status = 0; ::curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_status); if (http_status >= 400) { if (errorfn) { errorfn(std::move(buffer), std::string(), http_status); } } else { if (completefn) { completefn(std::move(buffer), http_status); } } } }