diff --git a/google/cloud/storage/internal/rest/stub.cc b/google/cloud/storage/internal/rest/stub.cc index c3fdad7ab5f34..8cc9feeb8a9ca 100644 --- a/google/cloud/storage/internal/rest/stub.cc +++ b/google/cloud/storage/internal/rest/stub.cc @@ -118,6 +118,20 @@ Status AddAuthorizationHeader(Options const& options, return {}; } +void AddCustomHeaders(Options const& options, RestRequestBuilder& builder) { + if (!options.has()) return; + for (auto const& h : options.get()) { + builder.AddHeader(h.first, h.second); + } +} + +Status AddHeaders(Options const& options, RestRequestBuilder& builder) { + auto ah = AddAuthorizationHeader(options, builder); + if (!ah.ok()) return ah; + AddCustomHeaders(options, builder); + return {}; +} + } // namespace RestStub::RestStub(Options options) @@ -165,8 +179,8 @@ StatusOr RestStub::ListBuckets( ListBucketsRequest const& request) { RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddQueryParameter("project", request.project_id()); return ParseFromRestResponse( @@ -178,8 +192,8 @@ StatusOr RestStub::CreateBucket( CreateBucketRequest const& request) { RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddQueryParameter("project", request.project_id()); builder.AddHeader("Content-Type", "application/json"); @@ -204,8 +218,8 @@ StatusOr RestStub::GetBucketMetadata( RestRequestBuilder builder(absl::StrCat("storage/", options.get(), "/b/", request.bucket_name())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return CheckedFromString( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -217,8 +231,8 @@ StatusOr RestStub::DeleteBucket( RestRequestBuilder builder(absl::StrCat("storage/", options.get(), "/b/", request.bucket_name())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ReturnEmptyResponse( storage_rest_client_->Delete(context, std::move(builder).BuildRequest())); @@ -230,8 +244,8 @@ StatusOr RestStub::UpdateBucket( RestRequestBuilder builder(absl::StrCat("storage/", options.get(), "/b/", request.metadata().name())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto payload = request.json_payload(); @@ -246,8 +260,8 @@ StatusOr RestStub::PatchBucket( RestRequestBuilder builder(absl::StrCat("storage/", options.get(), "/b/", request.bucket())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto payload = request.payload(); @@ -262,8 +276,8 @@ StatusOr RestStub::GetNativeBucketIamPolicy( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/iam")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return CreateFromJson( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -275,8 +289,8 @@ StatusOr RestStub::SetNativeBucketIamPolicy( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/iam")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto const& payload = request.json_payload(); @@ -291,8 +305,8 @@ StatusOr RestStub::TestBucketIamPermissions( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/iam/testPermissions")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; for (auto const& p : request.permissions()) { builder.AddQueryParameter("permissions", p); } @@ -307,8 +321,8 @@ StatusOr RestStub::LockBucketRetentionPolicy( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/lockRetentionPolicy")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); builder.AddOption(IfMetagenerationMatch(request.metageneration())); @@ -328,8 +342,8 @@ StatusOr RestStub::InsertObjectMediaMultipart( RestRequestBuilder builder(absl::StrCat("upload/storage/", options.get(), "/b/", request.bucket_name(), "/o")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; AddOptionsWithSkip no_content_type{builder}; request.ForEachOption(no_content_type); @@ -396,8 +410,8 @@ StatusOr RestStub::InsertObjectMediaSimple( RestRequestBuilder builder(absl::StrCat("upload/storage/", options.get(), "/b/", request.bucket_name(), "/o")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); if (request.HasOption()) { builder.AddQueryParameter(UserIp::name(), @@ -446,8 +460,8 @@ StatusOr RestStub::CopyObject( request.source_bucket(), "/o/", UrlEncode(request.source_object()), "/copyTo/b/", request.destination_bucket(), "/o/", UrlEncode(request.destination_object()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); std::string json_payload("{}"); @@ -468,8 +482,8 @@ StatusOr RestStub::GetObjectMetadata( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return CheckedFromString( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -481,8 +495,8 @@ StatusOr> RestStub::ReadObject( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddQueryParameter("alt", "media"); @@ -521,8 +535,8 @@ StatusOr RestStub::ListObjects( RestRequestBuilder builder(absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/o")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddQueryParameter("pageToken", request.page_token()); return ParseFromRestResponse( @@ -535,8 +549,8 @@ StatusOr RestStub::DeleteObject( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ReturnEmptyResponse( storage_rest_client_->Delete(context, std::move(builder).BuildRequest())); @@ -548,8 +562,8 @@ StatusOr RestStub::UpdateObject( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto payload = request.json_payload(); @@ -565,8 +579,8 @@ StatusOr RestStub::MoveObject( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.source_object_name()), "/moveTo/o/", UrlEncode(request.destination_object_name()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); std::string json_payload("{}"); @@ -582,8 +596,8 @@ StatusOr RestStub::PatchObject( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto payload = request.payload(); @@ -599,8 +613,8 @@ StatusOr RestStub::ComposeObject( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()), "/compose")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto payload = request.JsonPayload(); @@ -617,8 +631,8 @@ StatusOr RestStub::RewriteObject( request.source_bucket(), "/o/", UrlEncode(request.source_object()), "/rewriteTo/b/", request.destination_bucket(), "/o/", UrlEncode(request.destination_object()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); if (!request.rewrite_token().empty()) { builder.AddQueryParameter("rewriteToken", request.rewrite_token()); @@ -643,8 +657,8 @@ StatusOr RestStub::RestoreObject( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()), "/restore?generation=", request.generation())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); std::string json_payload("{}"); @@ -660,8 +674,8 @@ StatusOr RestStub::CreateResumableUpload( RestRequestBuilder builder(absl::StrCat("upload/storage/", options.get(), "/b/", request.bucket_name(), "/o")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; AddOptionsWithSkip no_content_type{builder}; request.ForEachOption(no_content_type); @@ -703,8 +717,8 @@ StatusOr RestStub::QueryResumableUpload( rest_internal::RestContext& context, Options const& options, QueryResumableUploadRequest const& request) { RestRequestBuilder builder(request.upload_session_url()); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Range", "bytes */*"); builder.AddHeader("Content-Type", "application/octet-stream"); @@ -723,8 +737,8 @@ StatusOr RestStub::DeleteResumableUpload( rest_internal::RestContext& context, Options const& options, DeleteResumableUploadRequest const& request) { RestRequestBuilder builder(request.upload_session_url()); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); auto failure_predicate = [](rest::HttpStatusCode code) { @@ -741,8 +755,8 @@ StatusOr RestStub::UploadChunk( rest_internal::RestContext& context, Options const& options, UploadChunkRequest const& request) { RestRequestBuilder builder(request.upload_session_url()); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Range", request.RangeHeaderValue()); builder.AddHeader("Content-Type", "application/octet-stream"); @@ -774,8 +788,8 @@ StatusOr RestStub::ListBucketAcl( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/acl")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ParseFromRestResponse( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -787,8 +801,8 @@ StatusOr RestStub::GetBucketAcl( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/acl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return CheckedFromString( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -800,8 +814,8 @@ StatusOr RestStub::CreateBucketAcl( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/acl")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); nlohmann::json object; @@ -819,8 +833,8 @@ StatusOr RestStub::DeleteBucketAcl( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/acl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ReturnEmptyResponse( storage_rest_client_->Delete(context, std::move(builder).BuildRequest())); @@ -832,8 +846,8 @@ StatusOr RestStub::UpdateBucketAcl( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/acl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); nlohmann::json object; @@ -851,8 +865,8 @@ StatusOr RestStub::PatchBucketAcl( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/acl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto payload = request.payload(); @@ -867,8 +881,8 @@ StatusOr RestStub::ListObjectAcl( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()), "/acl")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ParseFromRestResponse( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -880,8 +894,8 @@ StatusOr RestStub::CreateObjectAcl( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()), "/acl")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); nlohmann::json object; @@ -900,8 +914,8 @@ StatusOr RestStub::DeleteObjectAcl( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()), "/acl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ReturnEmptyResponse( storage_rest_client_->Delete(context, std::move(builder).BuildRequest())); @@ -914,8 +928,8 @@ StatusOr RestStub::GetObjectAcl( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()), "/acl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return CheckedFromString( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -928,8 +942,8 @@ StatusOr RestStub::UpdateObjectAcl( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()), "/acl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); nlohmann::json object; @@ -948,8 +962,8 @@ StatusOr RestStub::PatchObjectAcl( "storage/", options.get(), "/b/", request.bucket_name(), "/o/", UrlEncode(request.object_name()), "/acl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto payload = request.payload(); @@ -964,8 +978,8 @@ StatusOr RestStub::ListDefaultObjectAcl( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/defaultObjectAcl")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ParseFromRestResponse( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -977,8 +991,8 @@ StatusOr RestStub::CreateDefaultObjectAcl( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/defaultObjectAcl")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); nlohmann::json object; @@ -997,8 +1011,8 @@ StatusOr RestStub::DeleteDefaultObjectAcl( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/defaultObjectAcl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ReturnEmptyResponse( storage_rest_client_->Delete(context, std::move(builder).BuildRequest())); @@ -1011,8 +1025,8 @@ StatusOr RestStub::GetDefaultObjectAcl( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/defaultObjectAcl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return CheckedFromString( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -1025,8 +1039,8 @@ StatusOr RestStub::UpdateDefaultObjectAcl( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/defaultObjectAcl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); nlohmann::json object; @@ -1045,8 +1059,8 @@ StatusOr RestStub::PatchDefaultObjectAcl( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/defaultObjectAcl/", UrlEncode(request.entity()))); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto payload = request.payload(); @@ -1061,8 +1075,8 @@ StatusOr RestStub::GetServiceAccount( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/projects/", request.project_id(), "/serviceAccount")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return CheckedFromString( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -1074,8 +1088,8 @@ StatusOr RestStub::ListHmacKeys( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/projects/", request.project_id(), "/hmacKeys")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ParseFromRestResponse( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -1087,8 +1101,8 @@ StatusOr RestStub::CreateHmacKey( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/projects/", request.project_id(), "/hmacKeys")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddQueryParameter("serviceAccountEmail", request.service_account()); return ParseFromRestResponse( @@ -1103,8 +1117,8 @@ StatusOr RestStub::DeleteHmacKey( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/projects/", request.project_id(), "/hmacKeys/", request.access_id())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ReturnEmptyResponse( storage_rest_client_->Delete(context, std::move(builder).BuildRequest())); @@ -1116,8 +1130,8 @@ StatusOr RestStub::GetHmacKey( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/projects/", request.project_id(), "/hmacKeys/", request.access_id())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return CheckedFromString( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -1129,8 +1143,8 @@ StatusOr RestStub::UpdateHmacKey( RestRequestBuilder builder(absl::StrCat( "storage/", options.get(), "/projects/", request.project_id(), "/hmacKeys/", request.access_id())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); nlohmann::json json_payload; if (!request.resource().state().empty()) { @@ -1151,8 +1165,8 @@ StatusOr RestStub::SignBlob( SignBlobRequest const& request) { RestRequestBuilder builder(absl::StrCat( "projects/-/serviceAccounts/", request.service_account(), ":signBlob")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; nlohmann::json json_payload; json_payload["payload"] = request.base64_encoded_blob(); if (!request.delegates().empty()) { @@ -1171,8 +1185,8 @@ StatusOr RestStub::ListNotifications( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/notificationConfigs")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ParseFromRestResponse( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -1184,8 +1198,8 @@ StatusOr RestStub::CreateNotification( RestRequestBuilder builder( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/notificationConfigs")); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); builder.AddHeader("Content-Type", "application/json"); auto payload = request.json_payload(); @@ -1201,8 +1215,8 @@ StatusOr RestStub::GetNotification( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/notificationConfigs/", request.notification_id())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return CheckedFromString( storage_rest_client_->Get(context, std::move(builder).BuildRequest())); @@ -1215,8 +1229,8 @@ StatusOr RestStub::DeleteNotification( absl::StrCat("storage/", options.get(), "/b/", request.bucket_name(), "/notificationConfigs/", request.notification_id())); - auto auth = AddAuthorizationHeader(options, builder); - if (!auth.ok()) return auth; + auto headers = AddHeaders(options, builder); + if (!headers.ok()) return headers; request.AddOptionsToHttpRequest(builder); return ReturnEmptyResponse( storage_rest_client_->Delete(context, std::move(builder).BuildRequest())); diff --git a/google/cloud/storage/internal/rest/stub.h b/google/cloud/storage/internal/rest/stub.h index a0d525f93e3db..d6a04a96c2a20 100644 --- a/google/cloud/storage/internal/rest/stub.h +++ b/google/cloud/storage/internal/rest/stub.h @@ -16,6 +16,7 @@ #define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_STORAGE_INTERNAL_REST_STUB_H #include "google/cloud/storage/internal/generic_stub.h" +#include "google/cloud/storage/internal/rest/request_builder.h" #include "google/cloud/storage/version.h" #include "google/cloud/internal/random.h" #include "google/cloud/internal/rest_client.h" diff --git a/google/cloud/storage/internal/rest/stub_test.cc b/google/cloud/storage/internal/rest/stub_test.cc index 7f9a8f461f033..c3b8f612b3679 100644 --- a/google/cloud/storage/internal/rest/stub_test.cc +++ b/google/cloud/storage/internal/rest/stub_test.cc @@ -18,7 +18,6 @@ #include "google/cloud/testing_util/mock_rest_client.h" #include "google/cloud/testing_util/status_matchers.h" #include -#include namespace google { namespace cloud { @@ -144,6 +143,31 @@ Matcher> const&> ExpectedPayload() { return An> const&>(); } +TEST(RestStubTest, GlobalCustomHeadersAppearInRequestTest) { + google::cloud::Options global_opts; + global_opts.set( + {{"custom-header-1", "value1"}, {"custom-header-2", "value2"}}); + auto mock_client = std::make_shared(); + EXPECT_CALL(*mock_client, Get(_, _)) + .WillOnce([](google::cloud::rest_internal::RestContext&, + google::cloud::rest_internal::RestRequest const& request) { + auto const& headers = request.headers(); + EXPECT_THAT(headers, + Contains(Pair("custom-header-1", + std::vector{"value1"}))); + EXPECT_THAT(headers, + Contains(Pair("custom-header-2", + std::vector{"value2"}))); + + return PermanentError(); + }); + auto stub = std::make_unique(global_opts, mock_client, mock_client); + ListObjectsRequest list_req("test_bucket"); + RestContext context(global_opts); + auto result = stub->ListObjects(context, global_opts, list_req); + EXPECT_FALSE(result.ok()); +} + TEST(RestStubTest, ListBuckets) { auto mock = std::make_shared(); EXPECT_CALL(*mock, Get(ExpectedContext(), ExpectedRequest()))