15
15
#include " io/file_util.h"
16
16
#include " io/line_reader.h"
17
17
#include " strings/escaping.h"
18
+ #include " util/cloud/gcp/gcp_utils.h"
18
19
19
20
using namespace std ;
20
21
namespace h2 = boost::beast::http;
@@ -24,9 +25,6 @@ namespace util {
24
25
namespace cloud {
25
26
26
27
namespace {
27
- constexpr char kDomain [] = " www.googleapis.com" ;
28
-
29
- using EmptyRequest = h2::request<h2::empty_body>;
30
28
31
29
auto Unexpected (std::errc code) {
32
30
return nonstd::make_unexpected (make_error_code (code));
@@ -46,28 +44,6 @@ auto Unexpected(std::errc code) {
46
44
return ec; \
47
45
} while (false )
48
46
49
- string AuthHeader (string_view access_token) {
50
- return absl::StrCat (" Bearer " , access_token);
51
- }
52
-
53
- EmptyRequest PrepareRequest (h2::verb req_verb, boost::beast::string_view url,
54
- const string_view access_token) {
55
- EmptyRequest req (req_verb, url, 11 );
56
- req.set (h2::field::host, kDomain );
57
- req.set (h2::field::authorization, AuthHeader (access_token));
58
- req.keep_alive (true );
59
-
60
- return req;
61
- }
62
-
63
- bool IsUnauthorized (const h2::header<false , h2::fields>& resp) {
64
- if (resp.result () != h2::status::unauthorized) {
65
- return false ;
66
- }
67
- auto it = resp.find (" WWW-Authenticate" );
68
-
69
- return it != resp.end ();
70
- }
71
47
72
48
io::Result<string> ExpandFile (string_view path) {
73
49
io::Result<io::StatShortVec> res = io::StatFiles (path);
@@ -177,36 +153,6 @@ io::Result<TokenTtl> ParseTokenResponse(std::string&& response) {
177
153
return result;
178
154
}
179
155
180
- using EmptyParserPtr = std::unique_ptr<h2::response_parser<h2::empty_body>>;
181
- io::Result<EmptyParserPtr> SendWithToken (GCPCredsProvider* provider, http::Client* client,
182
- EmptyRequest* req) {
183
- error_code ec;
184
- for (unsigned i = 0 ; i < 2 ; ++i) { // Iterate for possible token refresh.
185
- VLOG (1 ) << " HttpReq" << i << " : " << *req << " , socket " << client->native_handle ();
186
-
187
- RETURN_UNEXPECTED (client->Send (*req));
188
- EmptyParserPtr parser (new h2::response_parser<h2::empty_body>());
189
- RETURN_UNEXPECTED (client->ReadHeader (parser.get ()));
190
-
191
- VLOG (1 ) << " RespHeader" << i << " : " << parser->get ();
192
-
193
- if (parser->get ().result () == h2::status::ok) {
194
- return parser;
195
- };
196
-
197
- if (IsUnauthorized (parser->get ())) {
198
- RETURN_UNEXPECTED (provider->RefreshToken (client->proactor ()));
199
- req->set (h2::field::authorization, AuthHeader (provider->access_token ()));
200
-
201
- continue ;
202
- }
203
- ec = make_error_code (errc::bad_message);
204
- LOG (DFATAL) << " Unexpected response " << parser.get ();
205
- }
206
-
207
- return nonstd::make_unexpected (ec);
208
- }
209
-
210
156
#define FETCH_ARRAY_MEMBER (val ) \
211
157
if (!(val).IsArray()) \
212
158
return make_error_code(errc::bad_message); \
@@ -310,7 +256,7 @@ GCS::~GCS() {
310
256
std::error_code GCS::Connect (unsigned msec) {
311
257
client_->set_connect_timeout_ms (msec);
312
258
313
- return client_->Connect (kDomain , " 443" , ssl_ctx_);
259
+ return client_->Connect (GCP_API_DOMAIN , " 443" , ssl_ctx_);
314
260
}
315
261
316
262
error_code GCS::ListBuckets (ListBucketCb cb) {
@@ -321,12 +267,13 @@ error_code GCS::ListBuckets(ListBucketCb cb) {
321
267
322
268
rj::Document doc;
323
269
270
+ RobustSender sender (2 , &creds_provider_);
271
+
324
272
while (true ) {
325
- io::Result<EmptyParserPtr> parse_res =
326
- SendWithToken (&creds_provider_, client_.get (), &http_req);
273
+ io::Result<RobustSender::HeaderParserPtr> parse_res = sender.Send (client_.get (), &http_req);
327
274
if (!parse_res)
328
275
return parse_res.error ();
329
- EmptyParserPtr empty_parser = std::move (*parse_res);
276
+ RobustSender::HeaderParserPtr empty_parser = std::move (*parse_res);
330
277
h2::response_parser<h2::string_body> resp (std::move (*empty_parser));
331
278
RETURN_ERROR (client_->Recv (&resp));
332
279
@@ -376,12 +323,13 @@ error_code GCS::List(string_view bucket, string_view prefix, bool recursive,
376
323
auto http_req = PrepareRequest (h2::verb::get, url, creds_provider_.access_token ());
377
324
378
325
rj::Document doc;
326
+ RobustSender sender (2 , &creds_provider_);
379
327
while (true ) {
380
- io::Result<EmptyParserPtr> parse_res =
381
- SendWithToken (&creds_provider_, client_.get (), &http_req);
328
+ io::Result<RobustSender::HeaderParserPtr> parse_res = sender.Send (client_.get (), &http_req);
382
329
if (!parse_res)
383
330
return parse_res.error ();
384
- EmptyParserPtr empty_parser = std::move (*parse_res);
331
+ RobustSender::HeaderParserPtr empty_parser = std::move (*parse_res);
332
+
385
333
h2::response_parser<h2::string_body> resp (std::move (*empty_parser));
386
334
RETURN_ERROR (client_->Recv (&resp));
387
335
0 commit comments