7 #include <boost/beast/http/buffer_body.hpp> 8 #include <boost/beast/http/dynamic_body.hpp> 9 #include <boost/beast/http/parser.hpp> 11 #include "absl/strings/str_cat.h" 12 #include "absl/types/optional.h" 14 #include "util/gce/gce.h" 15 #include "util/http/https_client_pool.h" 16 #include "util/stats/varz_stats.h" 17 #include "util/status.h" 22 namespace h2 = ::boost::beast::http;
24 using bb_str_view = ::boost::beast::string_view;
26 inline absl::string_view absl_sv(
const bb_str_view s) {
27 return absl::string_view{s.data(), s.size()};
30 h2::request<h2::dynamic_body> PrepareGenericRequest(h2::verb req_verb,
const bb_str_view url,
31 const bb_str_view token);
33 inline Status ToStatus(const ::boost::system::error_code& ec) {
34 return ec ? Status(StatusCode::IO_ERROR, absl::StrCat(ec.value(),
": ", ec.message()))
38 inline bool DoesServerPushback(h2::status st) {
39 return st == h2::status::too_many_requests ||
40 h2::to_status_class(st) == h2::status_class::server_error;
43 inline bool IsUnauthorized(
const h2::header<false, h2::fields>& header) {
44 if (header.result() != h2::status::unauthorized) {
47 auto it = header.find(
"WWW-Authenticate");
49 return it != header.end();
52 inline void AddBearer(absl::string_view token, h2::header<true, h2::fields>* req) {
53 std::string token_header = absl::StrCat(
"Bearer ", token);
54 req->set(h2::field::authorization, token_header);
59 using Request = h2::request<h2::dynamic_body>;
60 using ClientHandle = http::HttpsClientPool::ClientHandle;
69 using error_code = ::boost::system::error_code;
71 virtual error_code SendRequestIterative(
const Request& req,
http::HttpsClient* client) = 0;
80 using Parser = h2::response_parser<h2::buffer_body>;
82 using ApiSenderBase::ApiSenderBase;
85 Parser*
parser() {
return parser_.has_value() ? &parser_.value() :
nullptr; }
88 error_code SendRequestIterative(
const Request& req,
http::HttpsClient* client)
final;
89 absl::optional<Parser> parser_;
93 extern ::std::unique_ptr<VarzQps> gcs_writes;
94 extern ::std::unique_ptr<VarzMapAverage5m> gcs_latency;
Parser * parser()
Can be called only SendGeneric returned success.