in src/oslogin_utils.cc [434:481]
bool HttpDo(const string& url, const string& data, string* response, long* http_code) {
if (response == NULL || http_code == NULL) {
return false;
}
CURLcode code(CURLE_FAILED_INIT);
curl_global_init(CURL_GLOBAL_ALL & ~CURL_GLOBAL_SSL);
CURL* curl = curl_easy_init();
std::ostringstream response_stream;
int retry_count = 0;
if (curl) {
struct curl_slist* header_list = NULL;
header_list = curl_slist_append(header_list, "Metadata-Flavor: Google");
if (header_list == NULL) {
curl_easy_cleanup(curl);
curl_global_cleanup();
return false;
}
do {
// Apply backoff strategy before retrying.
if (retry_count > 0) {
sleep(kBackoffDuration);
}
response_stream.str("");
response_stream.clear();
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &OnCurlWrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_stream);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5);
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
if (data != "") {
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
}
code = curl_easy_perform(curl);
if (code != CURLE_OK) {
curl_easy_cleanup(curl);
curl_global_cleanup();
return false;
}
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, http_code);
} while (retry_count++ < kMaxRetries && ShouldRetry(*http_code));
curl_slist_free_all(header_list);
}
*response = response_stream.str();
curl_easy_cleanup(curl);
curl_global_cleanup();
return true;
}