1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "google/cloud/storage/internal/hybrid_client.h"
16 #include "google/cloud/storage/internal/grpc_resumable_upload_session_url.h"
17 
18 namespace google {
19 namespace cloud {
20 namespace storage {
21 inline namespace STORAGE_CLIENT_NS {
22 namespace internal {
23 
HybridClient(ClientOptions options)24 HybridClient::HybridClient(ClientOptions options)
25     : grpc_(std::make_shared<GrpcClient>(options)),
26       curl_(CurlClient::Create(std::move(options))) {}
27 
client_options() const28 ClientOptions const& HybridClient::client_options() const {
29   return curl_->client_options();
30 }
31 
ListBuckets(ListBucketsRequest const & request)32 StatusOr<ListBucketsResponse> HybridClient::ListBuckets(
33     ListBucketsRequest const& request) {
34   return curl_->ListBuckets(request);
35 }
36 
CreateBucket(CreateBucketRequest const & request)37 StatusOr<BucketMetadata> HybridClient::CreateBucket(
38     CreateBucketRequest const& request) {
39   return curl_->CreateBucket(request);
40 }
41 
GetBucketMetadata(GetBucketMetadataRequest const & request)42 StatusOr<BucketMetadata> HybridClient::GetBucketMetadata(
43     GetBucketMetadataRequest const& request) {
44   return curl_->GetBucketMetadata(request);
45 }
46 
DeleteBucket(DeleteBucketRequest const & request)47 StatusOr<EmptyResponse> HybridClient::DeleteBucket(
48     DeleteBucketRequest const& request) {
49   return curl_->DeleteBucket(request);
50 }
51 
UpdateBucket(UpdateBucketRequest const & request)52 StatusOr<BucketMetadata> HybridClient::UpdateBucket(
53     UpdateBucketRequest const& request) {
54   return curl_->UpdateBucket(request);
55 }
56 
PatchBucket(PatchBucketRequest const & request)57 StatusOr<BucketMetadata> HybridClient::PatchBucket(
58     PatchBucketRequest const& request) {
59   return curl_->PatchBucket(request);
60 }
61 
GetBucketIamPolicy(GetBucketIamPolicyRequest const & request)62 StatusOr<IamPolicy> HybridClient::GetBucketIamPolicy(
63     GetBucketIamPolicyRequest const& request) {
64   return curl_->GetBucketIamPolicy(request);
65 }
66 
GetNativeBucketIamPolicy(GetBucketIamPolicyRequest const & request)67 StatusOr<NativeIamPolicy> HybridClient::GetNativeBucketIamPolicy(
68     GetBucketIamPolicyRequest const& request) {
69   return curl_->GetNativeBucketIamPolicy(request);
70 }
71 
SetBucketIamPolicy(SetBucketIamPolicyRequest const & request)72 StatusOr<IamPolicy> HybridClient::SetBucketIamPolicy(
73     SetBucketIamPolicyRequest const& request) {
74   return curl_->SetBucketIamPolicy(request);
75 }
76 
SetNativeBucketIamPolicy(SetNativeBucketIamPolicyRequest const & request)77 StatusOr<NativeIamPolicy> HybridClient::SetNativeBucketIamPolicy(
78     SetNativeBucketIamPolicyRequest const& request) {
79   return curl_->SetNativeBucketIamPolicy(request);
80 }
81 
82 StatusOr<TestBucketIamPermissionsResponse>
TestBucketIamPermissions(TestBucketIamPermissionsRequest const & request)83 HybridClient::TestBucketIamPermissions(
84     TestBucketIamPermissionsRequest const& request) {
85   return curl_->TestBucketIamPermissions(request);
86 }
87 
LockBucketRetentionPolicy(LockBucketRetentionPolicyRequest const & request)88 StatusOr<BucketMetadata> HybridClient::LockBucketRetentionPolicy(
89     LockBucketRetentionPolicyRequest const& request) {
90   return curl_->LockBucketRetentionPolicy(request);
91 }
92 
InsertObjectMedia(InsertObjectMediaRequest const & request)93 StatusOr<ObjectMetadata> HybridClient::InsertObjectMedia(
94     InsertObjectMediaRequest const& request) {
95   return grpc_->InsertObjectMedia(request);
96 }
97 
CopyObject(CopyObjectRequest const & request)98 StatusOr<ObjectMetadata> HybridClient::CopyObject(
99     CopyObjectRequest const& request) {
100   return curl_->CopyObject(request);
101 }
102 
GetObjectMetadata(GetObjectMetadataRequest const & request)103 StatusOr<ObjectMetadata> HybridClient::GetObjectMetadata(
104     GetObjectMetadataRequest const& request) {
105   return curl_->GetObjectMetadata(request);
106 }
107 
ReadObject(ReadObjectRangeRequest const & request)108 StatusOr<std::unique_ptr<ObjectReadSource>> HybridClient::ReadObject(
109     ReadObjectRangeRequest const& request) {
110   return grpc_->ReadObject(request);
111 }
112 
ListObjects(ListObjectsRequest const & request)113 StatusOr<ListObjectsResponse> HybridClient::ListObjects(
114     ListObjectsRequest const& request) {
115   return curl_->ListObjects(request);
116 }
117 
DeleteObject(DeleteObjectRequest const & request)118 StatusOr<EmptyResponse> HybridClient::DeleteObject(
119     DeleteObjectRequest const& request) {
120   return curl_->DeleteObject(request);
121 }
122 
UpdateObject(UpdateObjectRequest const & request)123 StatusOr<ObjectMetadata> HybridClient::UpdateObject(
124     UpdateObjectRequest const& request) {
125   return curl_->UpdateObject(request);
126 }
127 
PatchObject(PatchObjectRequest const & request)128 StatusOr<ObjectMetadata> HybridClient::PatchObject(
129     PatchObjectRequest const& request) {
130   return curl_->PatchObject(request);
131 }
132 
ComposeObject(ComposeObjectRequest const & request)133 StatusOr<ObjectMetadata> HybridClient::ComposeObject(
134     ComposeObjectRequest const& request) {
135   return curl_->ComposeObject(request);
136 }
137 
RewriteObject(RewriteObjectRequest const & request)138 StatusOr<RewriteObjectResponse> HybridClient::RewriteObject(
139     RewriteObjectRequest const& request) {
140   return curl_->RewriteObject(request);
141 }
142 
143 StatusOr<std::unique_ptr<ResumableUploadSession>>
CreateResumableSession(ResumableUploadRequest const & request)144 HybridClient::CreateResumableSession(ResumableUploadRequest const& request) {
145   return grpc_->CreateResumableSession(request);
146 }
147 
148 StatusOr<std::unique_ptr<ResumableUploadSession>>
RestoreResumableSession(std::string const & upload_id)149 HybridClient::RestoreResumableSession(std::string const& upload_id) {
150   if (internal::IsGrpcResumableSessionUrl(upload_id)) {
151     return grpc_->RestoreResumableSession(upload_id);
152   }
153   return curl_->RestoreResumableSession(upload_id);
154 }
155 
DeleteResumableUpload(DeleteResumableUploadRequest const & request)156 StatusOr<EmptyResponse> HybridClient::DeleteResumableUpload(
157     DeleteResumableUploadRequest const& request) {
158   if (internal::IsGrpcResumableSessionUrl(request.upload_session_url())) {
159     return grpc_->DeleteResumableUpload(request);
160   }
161   return curl_->DeleteResumableUpload(request);
162 }
163 
ListBucketAcl(ListBucketAclRequest const & request)164 StatusOr<ListBucketAclResponse> HybridClient::ListBucketAcl(
165     ListBucketAclRequest const& request) {
166   return curl_->ListBucketAcl(request);
167 }
168 
CreateBucketAcl(CreateBucketAclRequest const & request)169 StatusOr<BucketAccessControl> HybridClient::CreateBucketAcl(
170     CreateBucketAclRequest const& request) {
171   return curl_->CreateBucketAcl(request);
172 }
173 
DeleteBucketAcl(DeleteBucketAclRequest const & request)174 StatusOr<EmptyResponse> HybridClient::DeleteBucketAcl(
175     DeleteBucketAclRequest const& request) {
176   return curl_->DeleteBucketAcl(request);
177 }
178 
GetBucketAcl(GetBucketAclRequest const & request)179 StatusOr<BucketAccessControl> HybridClient::GetBucketAcl(
180     GetBucketAclRequest const& request) {
181   return curl_->GetBucketAcl(request);
182 }
183 
UpdateBucketAcl(UpdateBucketAclRequest const & request)184 StatusOr<BucketAccessControl> HybridClient::UpdateBucketAcl(
185     UpdateBucketAclRequest const& request) {
186   return curl_->UpdateBucketAcl(request);
187 }
188 
PatchBucketAcl(PatchBucketAclRequest const & request)189 StatusOr<BucketAccessControl> HybridClient::PatchBucketAcl(
190     PatchBucketAclRequest const& request) {
191   return curl_->PatchBucketAcl(request);
192 }
193 
ListObjectAcl(ListObjectAclRequest const & request)194 StatusOr<ListObjectAclResponse> HybridClient::ListObjectAcl(
195     ListObjectAclRequest const& request) {
196   return curl_->ListObjectAcl(request);
197 }
198 
CreateObjectAcl(CreateObjectAclRequest const & request)199 StatusOr<ObjectAccessControl> HybridClient::CreateObjectAcl(
200     CreateObjectAclRequest const& request) {
201   return curl_->CreateObjectAcl(request);
202 }
203 
DeleteObjectAcl(DeleteObjectAclRequest const & request)204 StatusOr<EmptyResponse> HybridClient::DeleteObjectAcl(
205     DeleteObjectAclRequest const& request) {
206   return curl_->DeleteObjectAcl(request);
207 }
208 
GetObjectAcl(GetObjectAclRequest const & request)209 StatusOr<ObjectAccessControl> HybridClient::GetObjectAcl(
210     GetObjectAclRequest const& request) {
211   return curl_->GetObjectAcl(request);
212 }
213 
UpdateObjectAcl(UpdateObjectAclRequest const & request)214 StatusOr<ObjectAccessControl> HybridClient::UpdateObjectAcl(
215     UpdateObjectAclRequest const& request) {
216   return curl_->UpdateObjectAcl(request);
217 }
218 
PatchObjectAcl(PatchObjectAclRequest const & request)219 StatusOr<ObjectAccessControl> HybridClient::PatchObjectAcl(
220     PatchObjectAclRequest const& request) {
221   return curl_->PatchObjectAcl(request);
222 }
223 
ListDefaultObjectAcl(ListDefaultObjectAclRequest const & request)224 StatusOr<ListDefaultObjectAclResponse> HybridClient::ListDefaultObjectAcl(
225     ListDefaultObjectAclRequest const& request) {
226   return curl_->ListDefaultObjectAcl(request);
227 }
228 
CreateDefaultObjectAcl(CreateDefaultObjectAclRequest const & request)229 StatusOr<ObjectAccessControl> HybridClient::CreateDefaultObjectAcl(
230     CreateDefaultObjectAclRequest const& request) {
231   return curl_->CreateDefaultObjectAcl(request);
232 }
233 
DeleteDefaultObjectAcl(DeleteDefaultObjectAclRequest const & request)234 StatusOr<EmptyResponse> HybridClient::DeleteDefaultObjectAcl(
235     DeleteDefaultObjectAclRequest const& request) {
236   return curl_->DeleteDefaultObjectAcl(request);
237 }
238 
GetDefaultObjectAcl(GetDefaultObjectAclRequest const & request)239 StatusOr<ObjectAccessControl> HybridClient::GetDefaultObjectAcl(
240     GetDefaultObjectAclRequest const& request) {
241   return curl_->GetDefaultObjectAcl(request);
242 }
243 
UpdateDefaultObjectAcl(UpdateDefaultObjectAclRequest const & request)244 StatusOr<ObjectAccessControl> HybridClient::UpdateDefaultObjectAcl(
245     UpdateDefaultObjectAclRequest const& request) {
246   return curl_->UpdateDefaultObjectAcl(request);
247 }
248 
PatchDefaultObjectAcl(PatchDefaultObjectAclRequest const & request)249 StatusOr<ObjectAccessControl> HybridClient::PatchDefaultObjectAcl(
250     PatchDefaultObjectAclRequest const& request) {
251   return curl_->PatchDefaultObjectAcl(request);
252 }
253 
GetServiceAccount(GetProjectServiceAccountRequest const & request)254 StatusOr<ServiceAccount> HybridClient::GetServiceAccount(
255     GetProjectServiceAccountRequest const& request) {
256   return curl_->GetServiceAccount(request);
257 }
258 
ListHmacKeys(ListHmacKeysRequest const & request)259 StatusOr<ListHmacKeysResponse> HybridClient::ListHmacKeys(
260     ListHmacKeysRequest const& request) {
261   return curl_->ListHmacKeys(request);
262 }
263 
CreateHmacKey(CreateHmacKeyRequest const & request)264 StatusOr<CreateHmacKeyResponse> HybridClient::CreateHmacKey(
265     CreateHmacKeyRequest const& request) {
266   return curl_->CreateHmacKey(request);
267 }
268 
DeleteHmacKey(DeleteHmacKeyRequest const & request)269 StatusOr<EmptyResponse> HybridClient::DeleteHmacKey(
270     DeleteHmacKeyRequest const& request) {
271   return curl_->DeleteHmacKey(request);
272 }
273 
GetHmacKey(GetHmacKeyRequest const & request)274 StatusOr<HmacKeyMetadata> HybridClient::GetHmacKey(
275     GetHmacKeyRequest const& request) {
276   return curl_->GetHmacKey(request);
277 }
278 
UpdateHmacKey(UpdateHmacKeyRequest const & request)279 StatusOr<HmacKeyMetadata> HybridClient::UpdateHmacKey(
280     UpdateHmacKeyRequest const& request) {
281   return curl_->UpdateHmacKey(request);
282 }
283 
SignBlob(SignBlobRequest const & request)284 StatusOr<SignBlobResponse> HybridClient::SignBlob(
285     SignBlobRequest const& request) {
286   return curl_->SignBlob(request);
287 }
288 
ListNotifications(ListNotificationsRequest const & request)289 StatusOr<ListNotificationsResponse> HybridClient::ListNotifications(
290     ListNotificationsRequest const& request) {
291   return curl_->ListNotifications(request);
292 }
293 
CreateNotification(CreateNotificationRequest const & request)294 StatusOr<NotificationMetadata> HybridClient::CreateNotification(
295     CreateNotificationRequest const& request) {
296   return curl_->CreateNotification(request);
297 }
298 
GetNotification(GetNotificationRequest const & request)299 StatusOr<NotificationMetadata> HybridClient::GetNotification(
300     GetNotificationRequest const& request) {
301   return curl_->GetNotification(request);
302 }
303 
DeleteNotification(DeleteNotificationRequest const & request)304 StatusOr<EmptyResponse> HybridClient::DeleteNotification(
305     DeleteNotificationRequest const& request) {
306   return curl_->DeleteNotification(request);
307 }
308 
309 }  // namespace internal
310 }  // namespace STORAGE_CLIENT_NS
311 }  // namespace storage
312 }  // namespace cloud
313 }  // namespace google
314