blob: bc381861b26d600a7651452ccd795d6dbe062fc3 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <iostream>
#include <utility>
#include "util/clearcut/curl_handle.h"
#include "util/clearcut/curl_http_client.h"
namespace cobalt {
namespace util {
namespace clearcut {
using clearcut::HTTPClient;
using clearcut::HTTPRequest;
using clearcut::HTTPResponse;
using util::Status;
using util::StatusCode;
bool CurlHTTPClient::global_init_called_ = false;
CurlHTTPClient::CurlHTTPClient() : HTTPClient() {
if (!CurlHTTPClient::global_init_called_) {
CurlHTTPClient::global_init_called_ = true;
curl_global_init(CURL_GLOBAL_ALL);
}
}
std::future<StatusOr<HTTPResponse>> CurlHTTPClient::Post(
HTTPRequest request, std::chrono::steady_clock::time_point deadline) {
return std::async(std::launch::async,
[request = std::move(request),
deadline]() mutable -> StatusOr<HTTPResponse> {
auto handle_or = CurlHandle::Init();
if (!handle_or.ok()) {
return handle_or.status();
}
auto handle = handle_or.ConsumeValueOrDie();
auto timeout_ms =
std::chrono::duration_cast<std::chrono::milliseconds>(
deadline - std::chrono::steady_clock::now())
.count();
handle->SetTimeout(timeout_ms);
handle->SetHeaders(request.headers);
return handle->Post(request.url, request.body);
});
}
} // namespace clearcut
} // namespace util
} // namespace cobalt