1 /*
2 * Copyright 2009-2017 Alibaba Cloud All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <ctime>
18 #include <algorithm>
19 #include <sstream>
20 #include <set>
21 #include <external/tinyxml2/tinyxml2.h>
22 #include <alibabacloud/oss/http/HttpType.h>
23 #include <alibabacloud/oss/Const.h>
24 #include <fstream>
25 #include "utils/Utils.h"
26 #include "utils/SignUtils.h"
27 #include "utils/ThreadExecutor.h"
28 #include "auth/HmacSha1Signer.h"
29 #include "OssClientImpl.h"
30 #include "utils/LogUtils.h"
31 #include "utils/FileSystemUtils.h"
32 #if !defined(OSS_DISABLE_RESUAMABLE)
33 #include "resumable/ResumableUploader.h"
34 #include "resumable/ResumableDownloader.h"
35 #include "resumable/ResumableCopier.h"
36 #endif
37 #include <posix/timer.h>
38 using namespace AlibabaCloud::OSS;
39 using namespace tinyxml2;
40
41 Url g_ags_url;
42
43 namespace
44 {
45 const std::string SERVICE_NAME = "OSS";
46 const char *TAG = "OssClientImpl";
47 }
48
OssClientImpl(const std::string & endpoint,const std::shared_ptr<CredentialsProvider> & credentialsProvider,const ClientConfiguration & configuration)49 OssClientImpl::OssClientImpl(const std::string &endpoint, const std::shared_ptr<CredentialsProvider>& credentialsProvider, const ClientConfiguration & configuration) :
50 Client(SERVICE_NAME, configuration),
51 endpoint_(endpoint),
52 credentialsProvider_(credentialsProvider),
53 signer_(std::make_shared<HmacSha1Signer>()),
54 executor_(configuration.executor ? configuration.executor :std::make_shared<ThreadExecutor>())
55 {
56 }
57
~OssClientImpl()58 OssClientImpl::~OssClientImpl()
59 {
60 }
61
asyncExecute(Runnable * r) const62 int OssClientImpl::asyncExecute(Runnable * r) const
63 {
64 if (executor_ == nullptr)
65 return 1;
66
67 executor_->execute(r);
68 return 0;
69 }
70
buildHttpRequest(const std::string & endpoint,const ServiceRequest & msg,Http::Method method) const71 std::shared_ptr<HttpRequest> OssClientImpl::buildHttpRequest(const std::string & endpoint, const ServiceRequest & msg, Http::Method method) const
72 {
73 auto httpRequest = std::make_shared<HttpRequest>(method);
74 auto calcContentMD5 = !!(msg.Flags()&REQUEST_FLAG_CONTENTMD5);
75 auto paramInPath = !!(msg.Flags()&REQUEST_FLAG_PARAM_IN_PATH);
76 httpRequest->setResponseStreamFactory(msg.ResponseStreamFactory());
77 addHeaders(httpRequest, msg.Headers());
78 addBody(httpRequest, msg.Body(), calcContentMD5);
79 if (paramInPath) {
80 httpRequest->setUrl(Url(msg.Path()));
81 }
82 else {
83 addSignInfo(httpRequest, msg);
84 addUrl(httpRequest, endpoint, msg);
85 }
86 addOther(httpRequest, msg);
87 return httpRequest;
88 }
89
hasResponseError(const std::shared_ptr<HttpResponse> & response) const90 bool OssClientImpl::hasResponseError(const std::shared_ptr<HttpResponse>&response) const
91 {
92 if (BASE::hasResponseError(response)) {
93 return true;
94 }
95
96 //check crc64
97 if (response->request().hasCheckCrc64() &&
98 !response->request().hasHeader(Http::RANGE) &&
99 response->hasHeader("x-oss-hash-crc64ecma")) {
100 uint64_t clientCrc64 = response->request().Crc64Result();
101 uint64_t serverCrc64 = std::strtoull(response->Header("x-oss-hash-crc64ecma").c_str(), nullptr, 10);
102 if (clientCrc64 != serverCrc64) {
103 response->setStatusCode(ERROR_CRC_INCONSISTENT);
104 std::stringstream ss;
105 ss << "Crc64 validation failed. Expected hash:" << serverCrc64
106 << " not equal to calculated hash:" << clientCrc64
107 << ". Transferd bytes:" << response->request().TransferedBytes()
108 << ". RequestId:" << response->Header("x-oss-request-id").c_str();
109 response->setStatusMsg(ss.str().c_str());
110 return true;
111 }
112 }
113
114 //check Calback
115 if (response->statusCode() == 203 &&
116 (response->request().hasHeader("x-oss-callback") ||
117 (response->request().url().query().find("callback=") != std::string::npos))) {
118 return true;
119 }
120
121 return false;
122 }
123
addHeaders(const std::shared_ptr<HttpRequest> & httpRequest,const HeaderCollection & headers) const124 void OssClientImpl::addHeaders(const std::shared_ptr<HttpRequest> &httpRequest, const HeaderCollection &headers) const
125 {
126 for (auto const& header : headers) {
127 httpRequest->addHeader(header.first, header.second);
128 }
129
130 //common headers
131 httpRequest->addHeader(Http::USER_AGENT, configuration().userAgent);
132
133 //Date
134 if (httpRequest->hasHeader("x-oss-date")) {
135 httpRequest->addHeader(Http::DATE, httpRequest->Header("x-oss-date"));
136 }
137 if (!httpRequest->hasHeader(Http::DATE)) {
138 #ifdef USE_AOS_TIME_POSIX_API
139 struct timespec currentTime;
140 time_t t;
141 clock_gettime(CLOCK_REALTIME, ¤tTime);
142 t = currentTime.tv_nsec/1000000000 + currentTime.tv_sec;
143 printf("----- time %lld ---------\r\n",t);
144 #else
145 std::time_t t = std::time(nullptr);
146 #endif
147 t += getRequestDateOffset();
148 httpRequest->addHeader(Http::DATE, ToGmtTime(t));
149 }
150 }
151
addBody(const std::shared_ptr<HttpRequest> & httpRequest,const std::shared_ptr<std::iostream> & body,bool contentMd5) const152 void OssClientImpl::addBody(const std::shared_ptr<HttpRequest> &httpRequest, const std::shared_ptr<std::iostream>& body, bool contentMd5) const
153 {
154 if (body == nullptr) {
155 Http::Method methold = httpRequest->method();
156 if (methold == Http::Method::Get || methold == Http::Method::Post) {
157 httpRequest->setHeader(Http::CONTENT_LENGTH, "0");
158 } else {
159 httpRequest->removeHeader(Http::CONTENT_LENGTH);
160 }
161 }
162
163 if ((body != nullptr) && !httpRequest->hasHeader(Http::CONTENT_LENGTH)) {
164 auto streamSize = GetIOStreamLength(*body);
165 httpRequest->setHeader(Http::CONTENT_LENGTH, std::to_string(streamSize));
166 }
167
168 if (contentMd5 && body && !httpRequest->hasHeader(Http::CONTENT_MD5)) {
169 auto md5 = ComputeContentMD5(*body);
170 httpRequest->setHeader(Http::CONTENT_MD5, md5);
171 }
172
173 httpRequest->addBody(body);
174 }
175
addSignInfo(const std::shared_ptr<HttpRequest> & httpRequest,const ServiceRequest & request) const176 void OssClientImpl::addSignInfo(const std::shared_ptr<HttpRequest> &httpRequest, const ServiceRequest &request) const
177 {
178 const Credentials credentials = credentialsProvider_->getCredentials();
179 if (!credentials.SessionToken().empty()) {
180 httpRequest->addHeader("x-oss-security-token", credentials.SessionToken());
181 }
182
183 //Sort the parameters
184 ParameterCollection parameters;
185 for (auto const¶m : request.Parameters()) {
186 parameters[param.first] = param.second;
187 }
188
189 std::string method = Http::MethodToString(httpRequest->method());
190
191 const OssRequest& ossRequest = static_cast<const OssRequest&>(request);
192 std::string resource;
193 resource.append("/");
194 if (!ossRequest.bucket().empty()) {
195 resource.append(ossRequest.bucket());
196 resource.append("/");
197 }
198 if (!ossRequest.key().empty()) {
199 resource.append(ossRequest.key());
200 }
201
202 std::string date = httpRequest->Header(Http::DATE);
203
204 SignUtils signUtils(signer_->version());
205 signUtils.build(method, resource, date, httpRequest->Headers(), parameters);
206 auto signature = signer_->generate(signUtils.CanonicalString(), credentials.AccessKeySecret());
207
208 std::stringstream authValue;
209 authValue
210 << "OSS "
211 << credentials.AccessKeyId()
212 << ":"
213 << signature;
214
215 httpRequest->addHeader(Http::AUTHORIZATION, authValue.str());
216
217 OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) request(%p) CanonicalString:%s", this, httpRequest.get(), signUtils.CanonicalString().c_str());
218 OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) request(%p) Authorization:%s", this, httpRequest.get(), authValue.str().c_str());
219 }
220
addUrl(const std::shared_ptr<HttpRequest> & httpRequest,const std::string & endpoint,const ServiceRequest & request) const221 void OssClientImpl::addUrl(const std::shared_ptr<HttpRequest> &httpRequest, const std::string &endpoint, const ServiceRequest &request) const
222 {
223 const OssRequest& ossRequest = static_cast<const OssRequest&>(request);
224
225 auto host = CombineHostString(endpoint, ossRequest.bucket(), configuration().isCname);
226 auto path = CombinePathString(endpoint, ossRequest.bucket(), ossRequest.key());
227
228 Url url(host);
229 url.setPath(path);
230
231 OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) request(%p) host:%s, path:%s", this, httpRequest.get(), host.c_str(), path.c_str());
232
233 auto parameters = request.Parameters();
234 if (!parameters.empty()) {
235 std::stringstream queryString;
236 for (const auto &p : parameters)
237 {
238 if (p.second.empty())
239 queryString << "&" << UrlEncode(p.first);
240 else
241 queryString << "&" << UrlEncode(p.first) << "=" << UrlEncode(p.second);
242 }
243 url.setQuery(queryString.str().substr(1));
244 }
245 httpRequest->setUrl(url);
246 g_ags_url = httpRequest->url();
247 //std::cout << "addUrl url:" << url.toString() <<std::endl;
248 //std::cout << "g_ags_url url:" << g_ags_url.toString() <<std::endl;
249 }
250
addOther(const std::shared_ptr<HttpRequest> & httpRequest,const ServiceRequest & request) const251 void OssClientImpl::addOther(const std::shared_ptr<HttpRequest> &httpRequest, const ServiceRequest &request) const
252 {
253 //progress
254 httpRequest->setTransferProgress(request.TransferProgress());
255
256 //crc64 check
257 auto checkCRC64 = !!(request.Flags()&REQUEST_FLAG_CHECK_CRC64);
258 if (configuration().enableCrc64 && checkCRC64 ) {
259 httpRequest->setCheckCrc64(true);
260 #ifdef ENABLE_OSS_TEST
261 if (!!(request.Flags()&0x80000000)) {
262 httpRequest->addHeader("oss-test-crc64", "1");
263 }
264 #endif
265 }
266 }
267
buildError(const Error & error) const268 OssError OssClientImpl::buildError(const Error &error) const
269 {
270 OssError err;
271 if (((error.Status() == 203) || (error.Status() > 299 && error.Status() < 600)) &&
272 !error.Message().empty()) {
273 XMLDocument doc;
274 XMLError xml_err;
275 if ((xml_err = doc.Parse(error.Message().c_str(), error.Message().size())) == XML_SUCCESS) {
276 XMLElement* root =doc.RootElement();
277 if (root && !std::strncmp("Error", root->Name(), 5)) {
278 XMLElement *node;
279 node = root->FirstChildElement("Code");
280 err.setCode(node ? node->GetText(): "");
281 node = root->FirstChildElement("Message");
282 err.setMessage(node ? node->GetText(): "");
283 node = root->FirstChildElement("RequestId");
284 err.setRequestId(node ? node->GetText(): "");
285 node = root->FirstChildElement("HostId");
286 err.setHost(node ? node->GetText(): "");
287 } else {
288 err.setCode("ParseXMLError");
289 err.setMessage("Xml format invalid, root node name is not Error. the content is:\n" + error.Message());
290 }
291 } else {
292 std::stringstream ss;
293 ss << "ParseXMLError:" << xml_err;
294 err.setCode(ss.str());
295 err.setMessage(XMLDocument::ErrorIDToName(xml_err));
296 }
297 }
298 else {
299 err.setCode(error.Code());
300 err.setMessage(error.Message());
301 }
302
303 //get from header if body has nothing
304 if (err.RequestId().empty()) {
305 auto it = error.Headers().find("x-oss-request-id");
306 if (it != error.Headers().end()) {
307 err.setRequestId(it->second);
308 }
309 }
310
311 return err;
312 }
313
buildResult(const OssRequest & request,const std::shared_ptr<HttpResponse> & httpResponse) const314 ServiceResult OssClientImpl::buildResult(const OssRequest &request, const std::shared_ptr<HttpResponse> &httpResponse) const
315 {
316 ServiceResult result;
317 auto flag = request.Flags();
318 if ((flag & REQUEST_FLAG_CHECK_CRC64) &&
319 (flag & REQUEST_FLAG_SAVE_CLIENT_CRC64)) {
320 httpResponse->addHeader("x-oss-hash-crc64ecma-by-client", std::to_string(httpResponse->request().Crc64Result()));
321 }
322 result.setRequestId(httpResponse->Header("x-oss-request-id"));
323 result.setPlayload(httpResponse->Body());
324 result.setResponseCode(httpResponse->statusCode());
325 result.setHeaderCollection(httpResponse->Headers());
326 return result;
327 }
328
MakeRequest(const OssRequest & request,Http::Method method) const329 OssOutcome OssClientImpl::MakeRequest(const OssRequest &request, Http::Method method) const
330 {
331 int ret = request.validate();
332 if (ret != 0) {
333 return OssOutcome(OssError("ValidateError", request.validateMessage(ret)));
334 }
335
336 auto outcome = BASE::AttemptRequest(endpoint_, request, method);
337 if (outcome.isSuccess()) {
338 return OssOutcome(buildResult(request, outcome.result()));
339 } else {
340 return OssOutcome(buildError(outcome.error()));
341 }
342 }
343
344 #if !defined(OSS_DISABLE_BUCKET)
345
ListBuckets(const ListBucketsRequest & request) const346 ListBucketsOutcome OssClientImpl::ListBuckets(const ListBucketsRequest &request) const
347 {
348 auto outcome = MakeRequest(request, Http::Method::Get);
349 if (outcome.isSuccess()) {
350 ListBucketsResult result(outcome.result().payload());
351 result.requestId_ = outcome.result().RequestId();
352 return result.ParseDone() ? ListBucketsOutcome(std::move(result)) :
353 ListBucketsOutcome(OssError("ParseXMLError", "Parsing ListBuckets result fail."));
354 } else {
355 return ListBucketsOutcome(outcome.error());
356 }
357 }
358
CreateBucket(const CreateBucketRequest & request) const359 CreateBucketOutcome OssClientImpl::CreateBucket(const CreateBucketRequest &request) const
360 {
361 auto outcome = MakeRequest(request, Http::Method::Put);
362 if (outcome.isSuccess()) {
363 return CreateBucketOutcome(Bucket());
364 } else {
365 return CreateBucketOutcome(outcome.error());
366 }
367 }
368
SetBucketAcl(const SetBucketAclRequest & request) const369 VoidOutcome OssClientImpl::SetBucketAcl(const SetBucketAclRequest& request) const
370 {
371 auto outcome = MakeRequest(request, Http::Method::Put);
372 if (outcome.isSuccess()) {
373 VoidResult result;
374 result.requestId_ = outcome.result().RequestId();
375 return VoidOutcome(result);
376 } else {
377 return VoidOutcome(outcome.error());
378 }
379 }
380
SetBucketLogging(const SetBucketLoggingRequest & request) const381 VoidOutcome OssClientImpl::SetBucketLogging(const SetBucketLoggingRequest& request) const
382 {
383 auto outcome = MakeRequest(request, Http::Method::Put);
384 if (outcome.isSuccess()) {
385 VoidResult result;
386 result.requestId_ = outcome.result().RequestId();
387 return VoidOutcome(result);
388 }
389 else {
390 return VoidOutcome(outcome.error());
391 }
392 }
393
SetBucketWebsite(const SetBucketWebsiteRequest & request) const394 VoidOutcome OssClientImpl::SetBucketWebsite(const SetBucketWebsiteRequest& request) const
395 {
396 auto outcome = MakeRequest(request, Http::Method::Put);
397 if (outcome.isSuccess()) {
398 VoidResult result;
399 result.requestId_ = outcome.result().RequestId();
400 return VoidOutcome(result);
401 }
402 else {
403 return VoidOutcome(outcome.error());
404 }
405 }
406
SetBucketReferer(const SetBucketRefererRequest & request) const407 VoidOutcome OssClientImpl::SetBucketReferer(const SetBucketRefererRequest& request) const
408 {
409 auto outcome = MakeRequest(request, Http::Method::Put);
410 if (outcome.isSuccess()) {
411 VoidResult result;
412 result.requestId_ = outcome.result().RequestId();
413 return VoidOutcome(result);
414 }
415 else {
416 return VoidOutcome(outcome.error());
417 }
418 }
419
SetBucketLifecycle(const SetBucketLifecycleRequest & request) const420 VoidOutcome OssClientImpl::SetBucketLifecycle(const SetBucketLifecycleRequest& request) const
421 {
422 auto outcome = MakeRequest(request, Http::Method::Put);
423 if (outcome.isSuccess()) {
424 VoidResult result;
425 result.requestId_ = outcome.result().RequestId();
426 return VoidOutcome(result);
427 }
428 else {
429 return VoidOutcome(outcome.error());
430 }
431 }
432
SetBucketCors(const SetBucketCorsRequest & request) const433 VoidOutcome OssClientImpl::SetBucketCors(const SetBucketCorsRequest& request) const
434 {
435 auto outcome = MakeRequest(request, Http::Method::Put);
436 if (outcome.isSuccess()) {
437 VoidResult result;
438 result.requestId_ = outcome.result().RequestId();
439 return VoidOutcome(result);
440 }
441 else {
442 return VoidOutcome(outcome.error());
443 }
444 }
445
SetBucketStorageCapacity(const SetBucketStorageCapacityRequest & request) const446 VoidOutcome OssClientImpl::SetBucketStorageCapacity(const SetBucketStorageCapacityRequest& request) const
447 {
448 auto outcome = MakeRequest(request, Http::Method::Put);
449 if (outcome.isSuccess()) {
450 VoidResult result;
451 result.requestId_ = outcome.result().RequestId();
452 return VoidOutcome(result);
453 }
454 else {
455 return VoidOutcome(outcome.error());
456 }
457 }
458
SetBucketPolicy(const SetBucketPolicyRequest & request) const459 VoidOutcome OssClientImpl::SetBucketPolicy(const SetBucketPolicyRequest& request) const
460 {
461 auto outcome = MakeRequest(request, Http::Method::Put);
462 if (outcome.isSuccess()) {
463 VoidResult result;
464 result.requestId_ = outcome.result().RequestId();
465 return VoidOutcome(result);
466 }
467 else {
468 return VoidOutcome(outcome.error());
469 }
470 }
SetBucketRequestPayment(const SetBucketRequestPaymentRequest & request) const471 VoidOutcome OssClientImpl::SetBucketRequestPayment(const SetBucketRequestPaymentRequest& request) const
472 {
473 auto outcome = MakeRequest(request, Http::Method::Put);
474 if (outcome.isSuccess()) {
475 VoidResult result;
476 result.requestId_ = outcome.result().RequestId();
477 return VoidOutcome(result);
478 }
479 else {
480 return VoidOutcome(outcome.error());
481 }
482 }
483
SetBucketEncryption(const SetBucketEncryptionRequest & request) const484 VoidOutcome AlibabaCloud::OSS::OssClientImpl::SetBucketEncryption(const SetBucketEncryptionRequest& request) const
485 {
486 auto outcome = MakeRequest(request, Http::Method::Put);
487 if (outcome.isSuccess()) {
488 VoidResult result;
489 result.requestId_ = outcome.result().RequestId();
490 return VoidOutcome(result);
491 }
492 else {
493 return VoidOutcome(outcome.error());
494 }
495 }
496
SetBucketTagging(const SetBucketTaggingRequest & request) const497 VoidOutcome OssClientImpl::SetBucketTagging(const SetBucketTaggingRequest& request) const
498 {
499 auto outcome = MakeRequest(request, Http::Method::Put);
500 if (outcome.isSuccess()) {
501 VoidResult result;
502 result.requestId_ = outcome.result().RequestId();
503 return VoidOutcome(result);
504 }
505 else {
506 return VoidOutcome(outcome.error());
507 }
508 }
509
SetBucketQosInfo(const SetBucketQosInfoRequest & request) const510 VoidOutcome OssClientImpl::SetBucketQosInfo(const SetBucketQosInfoRequest& request) const
511 {
512 auto outcome = MakeRequest(request, Http::Method::Put);
513 if (outcome.isSuccess()) {
514 VoidResult result;
515 result.requestId_ = outcome.result().RequestId();
516 return VoidOutcome(result);
517 }
518 else {
519 return VoidOutcome(outcome.error());
520 }
521 }
522
SetBucketVersioning(const SetBucketVersioningRequest & request) const523 VoidOutcome OssClientImpl::SetBucketVersioning(const SetBucketVersioningRequest& request) const
524 {
525 auto outcome = MakeRequest(request, Http::Method::Put);
526 if (outcome.isSuccess()) {
527 VoidResult result;
528 result.requestId_ = outcome.result().RequestId();
529 return VoidOutcome(result);
530 }
531 else {
532 return VoidOutcome(outcome.error());
533 }
534 }
535
SetBucketInventoryConfiguration(const SetBucketInventoryConfigurationRequest & request) const536 VoidOutcome OssClientImpl::SetBucketInventoryConfiguration(const SetBucketInventoryConfigurationRequest& request) const
537 {
538 auto outcome = MakeRequest(request, Http::Method::Put);
539 if (outcome.isSuccess()) {
540 VoidResult result;
541 result.requestId_ = outcome.result().RequestId();
542 return VoidOutcome(result);
543 }
544 else {
545 return VoidOutcome(outcome.error());
546 }
547 }
548
DeleteBucket(const DeleteBucketRequest & request) const549 VoidOutcome OssClientImpl::DeleteBucket(const DeleteBucketRequest &request) const
550 {
551 auto outcome = MakeRequest(request, Http::Method::Delete);
552 if (outcome.isSuccess()) {
553 VoidResult result;
554 result.requestId_ = outcome.result().RequestId();
555 return VoidOutcome(result);
556 }
557 else {
558 return VoidOutcome(outcome.error());
559 }
560 }
561
DeleteBucketLogging(const DeleteBucketLoggingRequest & request) const562 VoidOutcome OssClientImpl::DeleteBucketLogging(const DeleteBucketLoggingRequest &request) const
563 {
564 auto outcome = MakeRequest(request, Http::Method::Delete);
565 if (outcome.isSuccess()) {
566 VoidResult result;
567 result.requestId_ = outcome.result().RequestId();
568 return VoidOutcome(result);
569 }
570 else {
571 return VoidOutcome(outcome.error());
572 }
573 }
574
DeleteBucketWebsite(const DeleteBucketWebsiteRequest & request) const575 VoidOutcome OssClientImpl::DeleteBucketWebsite(const DeleteBucketWebsiteRequest &request) const
576 {
577 auto outcome = MakeRequest(request, Http::Method::Delete);
578 if (outcome.isSuccess()) {
579 VoidResult result;
580 result.requestId_ = outcome.result().RequestId();
581 return VoidOutcome(result);
582 }
583 else {
584 return VoidOutcome(outcome.error());
585 }
586 }
587
DeleteBucketLifecycle(const DeleteBucketLifecycleRequest & request) const588 VoidOutcome OssClientImpl::DeleteBucketLifecycle(const DeleteBucketLifecycleRequest &request) const
589 {
590 auto outcome = MakeRequest(request, Http::Method::Delete);
591 if (outcome.isSuccess()) {
592 VoidResult result;
593 result.requestId_ = outcome.result().RequestId();
594 return VoidOutcome(result);
595 }
596 else {
597 return VoidOutcome(outcome.error());
598 }
599 }
600
DeleteBucketCors(const DeleteBucketCorsRequest & request) const601 VoidOutcome OssClientImpl::DeleteBucketCors(const DeleteBucketCorsRequest& request) const
602 {
603 auto outcome = MakeRequest(request, Http::Method::Delete);
604 if (outcome.isSuccess()) {
605 VoidResult result;
606 result.requestId_ = outcome.result().RequestId();
607 return VoidOutcome(result);
608 }
609 else {
610 return VoidOutcome(outcome.error());
611 }
612 }
613
DeleteBucketPolicy(const DeleteBucketPolicyRequest & request) const614 VoidOutcome OssClientImpl::DeleteBucketPolicy(const DeleteBucketPolicyRequest& request) const
615 {
616 auto outcome = MakeRequest(request, Http::Method::Delete);
617 if (outcome.isSuccess()) {
618 VoidResult result;
619 result.requestId_ = outcome.result().RequestId();
620 return VoidOutcome(result);
621 }
622 else {
623 return VoidOutcome(outcome.error());
624 }
625 }
626
DeleteBucketEncryption(const DeleteBucketEncryptionRequest & request) const627 VoidOutcome OssClientImpl::DeleteBucketEncryption(const DeleteBucketEncryptionRequest& request) const
628 {
629 auto outcome = MakeRequest(request, Http::Method::Delete);
630 if (outcome.isSuccess()) {
631 VoidResult result;
632 result.requestId_ = outcome.result().RequestId();
633 return VoidOutcome(result);
634 }
635 else {
636 return VoidOutcome(outcome.error());
637 }
638 }
639
DeleteBucketTagging(const DeleteBucketTaggingRequest & request) const640 VoidOutcome OssClientImpl::DeleteBucketTagging(const DeleteBucketTaggingRequest& request) const
641 {
642 auto outcome = MakeRequest(request, Http::Method::Delete);
643 if (outcome.isSuccess()) {
644 VoidResult result;
645 result.requestId_ = outcome.result().RequestId();
646 return VoidOutcome(result);
647 }
648 else {
649 return VoidOutcome(outcome.error());
650 }
651 }
652
DeleteBucketQosInfo(const DeleteBucketQosInfoRequest & request) const653 VoidOutcome OssClientImpl::DeleteBucketQosInfo(const DeleteBucketQosInfoRequest& request) const
654 {
655 auto outcome = MakeRequest(request, Http::Method::Delete);
656 if (outcome.isSuccess()) {
657 VoidResult result;
658 result.requestId_ = outcome.result().RequestId();
659 return VoidOutcome(result);
660 }
661 else {
662 return VoidOutcome(outcome.error());
663 }
664 }
665
DeleteBucketInventoryConfiguration(const DeleteBucketInventoryConfigurationRequest & request) const666 VoidOutcome OssClientImpl::DeleteBucketInventoryConfiguration(const DeleteBucketInventoryConfigurationRequest& request) const
667 {
668 auto outcome = MakeRequest(request, Http::Method::Delete);
669 if (outcome.isSuccess()) {
670 VoidResult result;
671 result.requestId_ = outcome.result().RequestId();
672 return VoidOutcome(result);
673 }
674 else {
675 return VoidOutcome(outcome.error());
676 }
677 }
678
GetBucketAcl(const GetBucketAclRequest & request) const679 GetBucketAclOutcome OssClientImpl::GetBucketAcl(const GetBucketAclRequest &request) const
680 {
681 auto outcome = MakeRequest(request, Http::Method::Get);
682 if (outcome.isSuccess()) {
683 GetBucketAclResult result(outcome.result().payload());
684 result.requestId_ = outcome.result().RequestId();
685 return result.ParseDone() ? GetBucketAclOutcome(std::move(result)) :
686 GetBucketAclOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
687 }
688 else {
689 return GetBucketAclOutcome(outcome.error());
690 }
691 }
692
GetBucketLocation(const GetBucketLocationRequest & request) const693 GetBucketLocationOutcome OssClientImpl::GetBucketLocation(const GetBucketLocationRequest &request) const
694 {
695 auto outcome = MakeRequest(request, Http::Method::Get);
696 if (outcome.isSuccess()) {
697 GetBucketLocationResult result(outcome.result().payload());
698 result.requestId_ = outcome.result().RequestId();
699 return result.ParseDone() ? GetBucketLocationOutcome(std::move(result)) :
700 GetBucketLocationOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
701 }
702 else {
703 return GetBucketLocationOutcome(outcome.error());
704 }
705 }
706
GetBucketInfo(const GetBucketInfoRequest & request) const707 GetBucketInfoOutcome OssClientImpl::GetBucketInfo(const GetBucketInfoRequest &request) const
708 {
709 auto outcome = MakeRequest(request, Http::Method::Get);
710 if (outcome.isSuccess()) {
711 GetBucketInfoResult result(outcome.result().payload());
712 result.requestId_ = outcome.result().RequestId();
713 return result.ParseDone() ? GetBucketInfoOutcome(std::move(result)) :
714 GetBucketInfoOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
715 }
716 else {
717 return GetBucketInfoOutcome(outcome.error());
718 }
719 }
720
GetBucketLogging(const GetBucketLoggingRequest & request) const721 GetBucketLoggingOutcome OssClientImpl::GetBucketLogging(const GetBucketLoggingRequest &request) const
722 {
723 auto outcome = MakeRequest(request, Http::Method::Get);
724 if (outcome.isSuccess()) {
725 GetBucketLoggingResult result(outcome.result().payload());
726 result.requestId_ = outcome.result().RequestId();
727 return result.ParseDone() ? GetBucketLoggingOutcome(std::move(result)) :
728 GetBucketLoggingOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
729 }
730 else {
731 return GetBucketLoggingOutcome(outcome.error());
732 }
733 }
734
GetBucketWebsite(const GetBucketWebsiteRequest & request) const735 GetBucketWebsiteOutcome OssClientImpl::GetBucketWebsite(const GetBucketWebsiteRequest &request) const
736 {
737 auto outcome = MakeRequest(request, Http::Method::Get);
738 if (outcome.isSuccess()) {
739 GetBucketWebsiteResult result(outcome.result().payload());
740 result.requestId_ = outcome.result().RequestId();
741 return result.ParseDone() ? GetBucketWebsiteOutcome(std::move(result)) :
742 GetBucketWebsiteOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
743 }
744 else {
745 return GetBucketWebsiteOutcome(outcome.error());
746 }
747 }
748
GetBucketReferer(const GetBucketRefererRequest & request) const749 GetBucketRefererOutcome OssClientImpl::GetBucketReferer(const GetBucketRefererRequest &request) const
750 {
751 auto outcome = MakeRequest(request, Http::Method::Get);
752 if (outcome.isSuccess()) {
753 GetBucketRefererResult result(outcome.result().payload());
754 result.requestId_ = outcome.result().RequestId();
755 return result.ParseDone() ? GetBucketRefererOutcome(std::move(result)) :
756 GetBucketRefererOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
757 }
758 else {
759 return GetBucketRefererOutcome(outcome.error());
760 }
761 }
762
GetBucketLifecycle(const GetBucketLifecycleRequest & request) const763 GetBucketLifecycleOutcome OssClientImpl::GetBucketLifecycle(const GetBucketLifecycleRequest &request) const
764 {
765 auto outcome = MakeRequest(request, Http::Method::Get);
766 if (outcome.isSuccess()) {
767 GetBucketLifecycleResult result(outcome.result().payload());
768 result.requestId_ = outcome.result().RequestId();
769 return result.ParseDone() ? GetBucketLifecycleOutcome(std::move(result)) :
770 GetBucketLifecycleOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
771 }
772 else {
773 return GetBucketLifecycleOutcome(outcome.error());
774 }
775 }
776
GetBucketStat(const GetBucketStatRequest & request) const777 GetBucketStatOutcome OssClientImpl::GetBucketStat(const GetBucketStatRequest &request) const
778 {
779 auto outcome = MakeRequest(request, Http::Method::Get);
780 if (outcome.isSuccess()) {
781 GetBucketStatResult result(outcome.result().payload());
782 result.requestId_ = outcome.result().RequestId();
783 return result.ParseDone() ? GetBucketStatOutcome(std::move(result)) :
784 GetBucketStatOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
785 }
786 else {
787 return GetBucketStatOutcome(outcome.error());
788 }
789 }
790
GetBucketCors(const GetBucketCorsRequest & request) const791 GetBucketCorsOutcome OssClientImpl::GetBucketCors(const GetBucketCorsRequest &request) const
792 {
793 auto outcome = MakeRequest(request, Http::Method::Get);
794 if (outcome.isSuccess()) {
795 GetBucketCorsResult result(outcome.result().payload());
796 result.requestId_ = outcome.result().RequestId();
797 return result.ParseDone() ? GetBucketCorsOutcome(std::move(result)) :
798 GetBucketCorsOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
799 }
800 else {
801 return GetBucketCorsOutcome(outcome.error());
802 }
803 }
804
GetBucketStorageCapacity(const GetBucketStorageCapacityRequest & request) const805 GetBucketStorageCapacityOutcome OssClientImpl::GetBucketStorageCapacity(const GetBucketStorageCapacityRequest& request) const
806 {
807 auto outcome = MakeRequest(request, Http::Method::Get);
808 if (outcome.isSuccess()) {
809 GetBucketStorageCapacityResult result(outcome.result().payload());
810 result.requestId_ = outcome.result().RequestId();
811 return result.ParseDone() ? GetBucketStorageCapacityOutcome(std::move(result)) :
812 GetBucketStorageCapacityOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
813 }
814 else {
815 return GetBucketStorageCapacityOutcome(outcome.error());
816 }
817 }
818
GetBucketPolicy(const GetBucketPolicyRequest & request) const819 GetBucketPolicyOutcome OssClientImpl::GetBucketPolicy(const GetBucketPolicyRequest& request) const
820 {
821 auto outcome = MakeRequest(request, Http::Method::Get);
822 if (outcome.isSuccess()) {
823 GetBucketPolicyResult result(outcome.result().payload());
824 result.requestId_ = outcome.result().RequestId();
825 return result.ParseDone() ? GetBucketPolicyOutcome(std::move(result)) :
826 GetBucketPolicyOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
827 }
828 else {
829 return GetBucketPolicyOutcome(outcome.error());
830 }
831 }
GetBucketRequestPayment(const GetBucketRequestPaymentRequest & request) const832 GetBucketPaymentOutcome OssClientImpl::GetBucketRequestPayment(const GetBucketRequestPaymentRequest& request) const
833 {
834 auto outcome = MakeRequest(request, Http::Method::Get);
835 if (outcome.isSuccess()) {
836 GetBucketPaymentResult result(outcome.result().payload());
837 result.requestId_ = outcome.result().RequestId();
838 return result.ParseDone() ? GetBucketPaymentOutcome(std::move(result)) :
839 GetBucketPaymentOutcome(OssError("ParseXMLError", "Parsing GetBucketPayment result fail."));
840 }
841 else {
842 return GetBucketPaymentOutcome(outcome.error());
843 }
844 }
845
GetBucketEncryption(const GetBucketEncryptionRequest & request) const846 GetBucketEncryptionOutcome OssClientImpl::GetBucketEncryption(const GetBucketEncryptionRequest& request) const
847 {
848 auto outcome = MakeRequest(request, Http::Method::Get);
849 if (outcome.isSuccess()) {
850 GetBucketEncryptionResult result(outcome.result().payload());
851 result.requestId_ = outcome.result().RequestId();
852 return result.ParseDone() ? GetBucketEncryptionOutcome(std::move(result)) :
853 GetBucketEncryptionOutcome(OssError("ParseXMLError", "Parsing GetBucketEncryption result fail."));
854 }
855 else {
856 return GetBucketEncryptionOutcome(outcome.error());
857 }
858 }
859
GetBucketTagging(const GetBucketTaggingRequest & request) const860 GetBucketTaggingOutcome OssClientImpl::GetBucketTagging(const GetBucketTaggingRequest& request) const
861 {
862 auto outcome = MakeRequest(request, Http::Method::Get);
863 if (outcome.isSuccess()) {
864 GetBucketTaggingResult result(outcome.result().payload());
865 result.requestId_ = outcome.result().RequestId();
866 return result.ParseDone() ? GetBucketTaggingOutcome(std::move(result)) :
867 GetBucketTaggingOutcome(OssError("ParseXMLError", "Parsing GetBucketTagging result fail."));
868 }
869 else {
870 return GetBucketTaggingOutcome(outcome.error());
871 }
872 }
873
GetBucketQosInfo(const GetBucketQosInfoRequest & request) const874 GetBucketQosInfoOutcome OssClientImpl::GetBucketQosInfo(const GetBucketQosInfoRequest& request) const
875 {
876 auto outcome = MakeRequest(request, Http::Method::Get);
877 if (outcome.isSuccess()) {
878 GetBucketQosInfoResult result(outcome.result().payload());
879 result.requestId_ = outcome.result().RequestId();
880 return result.ParseDone() ? GetBucketQosInfoOutcome(std::move(result)) :
881 GetBucketQosInfoOutcome(OssError("ParseXMLError", "Parsing GetBucketQosInfo result fail."));
882 }
883 else {
884 return GetBucketQosInfoOutcome(outcome.error());
885 }
886 }
887
GetUserQosInfo(const GetUserQosInfoRequest & request) const888 GetUserQosInfoOutcome OssClientImpl::GetUserQosInfo(const GetUserQosInfoRequest& request) const
889 {
890 auto outcome = MakeRequest(request, Http::Method::Get);
891 if (outcome.isSuccess()) {
892 GetUserQosInfoResult result(outcome.result().payload());
893 result.requestId_ = outcome.result().RequestId();
894 return result.ParseDone() ? GetUserQosInfoOutcome(std::move(result)) :
895 GetUserQosInfoOutcome(OssError("ParseXMLError", "Parsing GetUserQosInfo result fail."));
896 }
897 else {
898 return GetUserQosInfoOutcome(outcome.error());
899 }
900 }
901
GetBucketVersioning(const GetBucketVersioningRequest & request) const902 GetBucketVersioningOutcome OssClientImpl::GetBucketVersioning(const GetBucketVersioningRequest& request) const
903 {
904 auto outcome = MakeRequest(request, Http::Method::Get);
905 if (outcome.isSuccess()) {
906 GetBucketVersioningResult result(outcome.result().payload());
907 result.requestId_ = outcome.result().RequestId();
908 return result.ParseDone() ? GetBucketVersioningOutcome(std::move(result)) :
909 GetBucketVersioningOutcome(OssError("ParseXMLError", "Parsing GetBucketVersioning result fail."));
910 }
911 else {
912 return GetBucketVersioningOutcome(outcome.error());
913 }
914 }
915
GetBucketInventoryConfiguration(const GetBucketInventoryConfigurationRequest & request) const916 GetBucketInventoryConfigurationOutcome OssClientImpl::GetBucketInventoryConfiguration(const GetBucketInventoryConfigurationRequest& request) const
917 {
918 auto outcome = MakeRequest(request, Http::Method::Get);
919 if (outcome.isSuccess()) {
920 GetBucketInventoryConfigurationResult result(outcome.result().payload());
921 result.requestId_ = outcome.result().RequestId();
922 return result.ParseDone() ? GetBucketInventoryConfigurationOutcome(std::move(result)) :
923 GetBucketInventoryConfigurationOutcome(OssError("ParseXMLError", "Parsing GetBucketInventoryConfiguration result fail."));
924 }
925 else {
926 return GetBucketInventoryConfigurationOutcome(outcome.error());
927 }
928 }
929
ListBucketInventoryConfigurations(const ListBucketInventoryConfigurationsRequest & request) const930 ListBucketInventoryConfigurationsOutcome OssClientImpl::ListBucketInventoryConfigurations(const ListBucketInventoryConfigurationsRequest& request) const
931 {
932 auto outcome = MakeRequest(request, Http::Method::Get);
933 if (outcome.isSuccess()) {
934 ListBucketInventoryConfigurationsResult result(outcome.result().payload());
935 result.requestId_ = outcome.result().RequestId();
936 return result.ParseDone() ? ListBucketInventoryConfigurationsOutcome(std::move(result)) :
937 ListBucketInventoryConfigurationsOutcome(OssError("ParseXMLError", "Parsing ListBucketInventoryConfigurations result fail."));
938 }
939 else {
940 return ListBucketInventoryConfigurationsOutcome(outcome.error());
941 }
942 }
943 #endif
944
ListObjects(const ListObjectsRequest & request) const945 ListObjectOutcome OssClientImpl::ListObjects(const ListObjectsRequest &request) const
946 {
947 auto outcome = MakeRequest(request, Http::Method::Get);
948 if (outcome.isSuccess()) {
949 ListObjectsResult result(outcome.result().payload());
950 result.requestId_ = outcome.result().RequestId();
951 return result.ParseDone() ? ListObjectOutcome(std::move(result)) :
952 ListObjectOutcome(OssError("ParseXMLError", "Parsing ListObject result fail."));
953 }
954 else {
955 return ListObjectOutcome(outcome.error());
956 }
957 }
958
ListObjectVersions(const ListObjectVersionsRequest & request) const959 ListObjectVersionsOutcome OssClientImpl::ListObjectVersions(const ListObjectVersionsRequest &request) const
960 {
961 auto outcome = MakeRequest(request, Http::Method::Get);
962 if (outcome.isSuccess()) {
963 ListObjectVersionsResult result(outcome.result().payload());
964 result.requestId_ = outcome.result().RequestId();
965 return result.ParseDone() ? ListObjectVersionsOutcome(std::move(result)) :
966 ListObjectVersionsOutcome(OssError("ParseXMLError", "Parsing ListObjectVersions result fail."));
967 }
968 else {
969 return ListObjectVersionsOutcome(outcome.error());
970 }
971 }
972
973 #undef GetObject
GetObject(const GetObjectRequest & request) const974 GetObjectOutcome OssClientImpl::GetObject(const GetObjectRequest &request) const
975 {
976 auto outcome = MakeRequest(request, Http::Method::Get);
977 if (outcome.isSuccess()) {
978 return GetObjectOutcome(GetObjectResult(request.Bucket(), request.Key(),
979 outcome.result().payload(),outcome.result().headerCollection()));
980 }
981 else {
982 return GetObjectOutcome(outcome.error());
983 }
984 }
985
PutObject(const PutObjectRequest & request) const986 PutObjectOutcome OssClientImpl::PutObject(const PutObjectRequest &request) const
987 {
988 auto outcome = MakeRequest(request, Http::Method::Put);
989 if (outcome.isSuccess()) {
990 return PutObjectOutcome(PutObjectResult(outcome.result().headerCollection(),
991 outcome.result().payload()));
992 }
993 else {
994 return PutObjectOutcome(outcome.error());
995 }
996 }
997
DeleteObject(const DeleteObjectRequest & request) const998 DeleteObjectOutcome OssClientImpl::DeleteObject(const DeleteObjectRequest &request) const
999 {
1000 auto outcome = MakeRequest(request, Http::Method::Delete);
1001 if (outcome.isSuccess()) {
1002 return DeleteObjectOutcome(DeleteObjectResult(outcome.result().headerCollection()));
1003 }
1004 else {
1005 return DeleteObjectOutcome(outcome.error());
1006 }
1007 }
1008
DeleteObjects(const DeleteObjectsRequest & request) const1009 DeleteObjecstOutcome OssClientImpl::DeleteObjects(const DeleteObjectsRequest &request) const
1010 {
1011 auto outcome = MakeRequest(request, Http::Method::Post);
1012 if (outcome.isSuccess()) {
1013 DeleteObjectsResult result(outcome.result().payload());
1014 result.requestId_ = outcome.result().RequestId();
1015 return result.ParseDone() ? DeleteObjecstOutcome(std::move(result)) :
1016 DeleteObjecstOutcome(OssError("ParseXMLError", "Parsing DeleteObjects result fail."));
1017 }
1018 else {
1019 return DeleteObjecstOutcome(outcome.error());
1020 }
1021 }
1022
DeleteObjectVersions(const DeleteObjectVersionsRequest & request) const1023 DeleteObjecVersionstOutcome OssClientImpl::DeleteObjectVersions(const DeleteObjectVersionsRequest& request) const
1024 {
1025 auto outcome = MakeRequest(request, Http::Method::Post);
1026 if (outcome.isSuccess()) {
1027 DeleteObjectVersionsResult result(outcome.result().payload());
1028 result.requestId_ = outcome.result().RequestId();
1029 return result.ParseDone() ? DeleteObjecVersionstOutcome(std::move(result)) :
1030 DeleteObjecVersionstOutcome(OssError("ParseXMLError", "Parsing DeleteObjectVersions result fail."));
1031 }
1032 else {
1033 return DeleteObjecVersionstOutcome(outcome.error());
1034 }
1035 }
1036
HeadObject(const HeadObjectRequest & request) const1037 ObjectMetaDataOutcome OssClientImpl::HeadObject(const HeadObjectRequest &request) const
1038 {
1039 auto outcome = MakeRequest(request, Http::Method::Head);
1040 if (outcome.isSuccess()) {
1041 ObjectMetaData metaData = outcome.result().headerCollection();
1042 return ObjectMetaDataOutcome(std::move(metaData));
1043 }
1044 else {
1045 return ObjectMetaDataOutcome(outcome.error());
1046 }
1047 }
1048
GetObjectMeta(const GetObjectMetaRequest & request) const1049 ObjectMetaDataOutcome OssClientImpl::GetObjectMeta(const GetObjectMetaRequest &request) const
1050 {
1051 auto outcome = MakeRequest(request, Http::Method::Head);
1052 if (outcome.isSuccess()) {
1053 ObjectMetaData metaData = outcome.result().headerCollection();
1054 return ObjectMetaDataOutcome(std::move(metaData));
1055 }
1056 else {
1057 return ObjectMetaDataOutcome(outcome.error());
1058 }
1059 }
1060
GetObjectAcl(const GetObjectAclRequest & request) const1061 GetObjectAclOutcome OssClientImpl::GetObjectAcl(const GetObjectAclRequest &request) const
1062 {
1063 auto outcome = MakeRequest(request, Http::Method::Get);
1064 if (outcome.isSuccess()) {
1065 GetObjectAclResult result(outcome.result().headerCollection(), outcome.result().payload());
1066 return result.ParseDone() ? GetObjectAclOutcome(std::move(result)) :
1067 GetObjectAclOutcome(OssError("ParseXMLError", "Parsing GetObjectAcl result fail."));
1068 }
1069 else {
1070 return GetObjectAclOutcome(outcome.error());
1071 }
1072 }
1073
AppendObject(const AppendObjectRequest & request) const1074 AppendObjectOutcome OssClientImpl::AppendObject(const AppendObjectRequest &request) const
1075 {
1076 auto outcome = MakeRequest(request, Http::Method::Post);
1077 if (outcome.isSuccess()) {
1078 AppendObjectResult result(outcome.result().headerCollection());
1079 return result.ParseDone() ? AppendObjectOutcome(std::move(result)) :
1080 AppendObjectOutcome(OssError("ParseXMLError", "no position or no crc64"));
1081 }
1082 else {
1083 return AppendObjectOutcome(outcome.error());
1084 }
1085 }
1086
CopyObject(const CopyObjectRequest & request) const1087 CopyObjectOutcome OssClientImpl::CopyObject(const CopyObjectRequest &request) const
1088 {
1089 auto outcome = MakeRequest(request, Http::Method::Put);
1090 if (outcome.isSuccess()) {
1091 return CopyObjectOutcome(CopyObjectResult(outcome.result().headerCollection(), outcome.result().payload()));
1092 }
1093 else {
1094 return CopyObjectOutcome(outcome.error());
1095 }
1096 }
1097
GetSymlink(const GetSymlinkRequest & request) const1098 GetSymlinkOutcome OssClientImpl::GetSymlink(const GetSymlinkRequest &request) const
1099 {
1100 auto outcome = MakeRequest(request, Http::Method::Get);
1101 if (outcome.isSuccess()) {
1102 return GetSymlinkOutcome(GetSymlinkResult(outcome.result().headerCollection()));
1103 }
1104 else {
1105 return GetSymlinkOutcome(outcome.error());
1106 }
1107 }
1108
RestoreObject(const RestoreObjectRequest & request) const1109 RestoreObjectOutcome OssClientImpl::RestoreObject(const RestoreObjectRequest &request) const
1110 {
1111 auto outcome = MakeRequest(request, Http::Method::Post);
1112 if (outcome.isSuccess()) {
1113 return RestoreObjectOutcome(RestoreObjectResult(outcome.result().headerCollection()));
1114 }
1115 else {
1116 return RestoreObjectOutcome(outcome.error());
1117 }
1118 }
1119
CreateSymlink(const CreateSymlinkRequest & request) const1120 CreateSymlinkOutcome OssClientImpl::CreateSymlink(const CreateSymlinkRequest &request) const
1121 {
1122 auto outcome = MakeRequest(request, Http::Method::Put);
1123 if (outcome.isSuccess()) {
1124 return CreateSymlinkOutcome(CreateSymlinkResult(outcome.result().headerCollection()));
1125 }
1126 else {
1127 return CreateSymlinkOutcome(outcome.error());
1128 }
1129 }
1130
SetObjectAcl(const SetObjectAclRequest & request) const1131 SetObjectAclOutcome OssClientImpl::SetObjectAcl(const SetObjectAclRequest &request) const
1132 {
1133 auto outcome = MakeRequest(request, Http::Method::Put);
1134 if (outcome.isSuccess()) {
1135 return SetObjectAclOutcome(SetObjectAclResult(outcome.result().headerCollection()));
1136 }
1137 else {
1138 return SetObjectAclOutcome(outcome.error());
1139 }
1140 }
1141
ProcessObject(const ProcessObjectRequest & request) const1142 GetObjectOutcome OssClientImpl::ProcessObject(const ProcessObjectRequest &request) const
1143 {
1144 auto outcome = MakeRequest(request, Http::Method::Post);
1145 if (outcome.isSuccess()) {
1146 return GetObjectOutcome(GetObjectResult(request.Bucket(), request.Key(),
1147 outcome.result().payload(), outcome.result().headerCollection()));
1148 }
1149 else {
1150 return GetObjectOutcome(outcome.error());
1151 }
1152 }
1153
SelectObject(const SelectObjectRequest & request) const1154 GetObjectOutcome OssClientImpl::SelectObject(const SelectObjectRequest &request) const
1155 {
1156 auto outcome = MakeRequest(request, Http::Method::Post);
1157 int ret = request.dispose();
1158 if (outcome.isSuccess()) {
1159 return GetObjectOutcome(GetObjectResult(request.Bucket(), request.Key(),
1160 outcome.result().payload(), outcome.result().headerCollection()));
1161 }
1162 else {
1163 if (ret != 0) {
1164 return GetObjectOutcome(OssError("SelectObjectError", request.validateMessage(ret)));
1165 }
1166 return GetObjectOutcome(outcome.error());
1167 }
1168 }
1169
CreateSelectObjectMeta(const CreateSelectObjectMetaRequest & request) const1170 CreateSelectObjectMetaOutcome OssClientImpl::CreateSelectObjectMeta(const CreateSelectObjectMetaRequest &request) const
1171 {
1172 auto outcome = MakeRequest(request, Http::Method::Post);
1173 if (outcome.isSuccess()) {
1174 CreateSelectObjectMetaResult result(request.Bucket(), request.Key(),
1175 outcome.result().RequestId(), outcome.result().payload());
1176 return result.ParseDone() ? CreateSelectObjectMetaOutcome(result) :
1177 CreateSelectObjectMetaOutcome(OssError("ParseIOStreamError", "Parse create select object meta IOStream fail."));
1178 }
1179 else {
1180 return CreateSelectObjectMetaOutcome(outcome.error());
1181 }
1182 }
1183
SetObjectTagging(const SetObjectTaggingRequest & request) const1184 SetObjectTaggingOutcome OssClientImpl::SetObjectTagging(const SetObjectTaggingRequest& request) const
1185 {
1186 auto outcome = MakeRequest(request, Http::Method::Put);
1187 if (outcome.isSuccess()) {
1188 return SetObjectTaggingOutcome(SetObjectTaggingResult(outcome.result().headerCollection()));
1189 }
1190 else {
1191 return SetObjectTaggingOutcome(outcome.error());
1192 }
1193 }
1194
DeleteObjectTagging(const DeleteObjectTaggingRequest & request) const1195 DeleteObjectTaggingOutcome OssClientImpl::DeleteObjectTagging(const DeleteObjectTaggingRequest& request) const
1196 {
1197 auto outcome = MakeRequest(request, Http::Method::Delete);
1198 if (outcome.isSuccess()) {
1199 return DeleteObjectTaggingOutcome(DeleteObjectTaggingResult(outcome.result().headerCollection()));
1200 }
1201 else {
1202 return DeleteObjectTaggingOutcome(outcome.error());
1203 }
1204 }
1205
GetObjectTagging(const GetObjectTaggingRequest & request) const1206 GetObjectTaggingOutcome OssClientImpl::GetObjectTagging(const GetObjectTaggingRequest& request) const
1207 {
1208 auto outcome = MakeRequest(request, Http::Method::Get);
1209 if (outcome.isSuccess()) {
1210 GetObjectTaggingResult result(outcome.result().headerCollection(), outcome.result().payload());
1211 return result.ParseDone() ? GetObjectTaggingOutcome(std::move(result)) :
1212 GetObjectTaggingOutcome(OssError("ParseXMLError", "Parsing ObjectTagging result fail."));
1213 }
1214 else {
1215 return GetObjectTaggingOutcome(outcome.error());
1216 }
1217 }
1218
GeneratePresignedUrl(const GeneratePresignedUrlRequest & request) const1219 StringOutcome OssClientImpl::GeneratePresignedUrl(const GeneratePresignedUrlRequest &request) const
1220 {
1221 if (!IsValidBucketName(request.bucket_) ||
1222 !IsValidObjectKey(request.key_)) {
1223 return StringOutcome(OssError("ValidateError", "The Bucket or Key is invalid."));
1224 }
1225
1226 HeaderCollection headers = request.metaData_.toHeaderCollection();
1227
1228 ParameterCollection parameters;
1229 const Credentials credentials = credentialsProvider_->getCredentials();
1230 if (!credentials.SessionToken().empty()) {
1231 parameters["security-token"] = credentials.SessionToken();
1232 }
1233 for (auto const¶m : request.parameters_) {
1234 parameters[param.first] = param.second;
1235 }
1236
1237 SignUtils signUtils(signer_->version());
1238 auto method = Http::MethodToString(request.method_);
1239 auto resource = std::string().append("/").append(request.bucket_).append("/").append(request.key_);
1240 auto date = headers[Http::EXPIRES];
1241 signUtils.build(method, resource, date, headers, parameters);
1242 auto signature = signer_->generate(signUtils.CanonicalString(), credentials.AccessKeySecret());
1243 parameters["Expires"] = date;
1244 parameters["OSSAccessKeyId"] = credentials.AccessKeyId();
1245 parameters["Signature"] = signature;
1246
1247 std::stringstream ss;
1248 ss << CombineHostString(endpoint_, request.bucket_, configuration().isCname);
1249 ss << CombinePathString(endpoint_, request.bucket_, request.key_);
1250 ss << "?";
1251 ss << CombineQueryString(parameters);
1252
1253 return StringOutcome(ss.str());
1254 }
1255
GetObjectByUrl(const GetObjectByUrlRequest & request) const1256 GetObjectOutcome OssClientImpl::GetObjectByUrl(const GetObjectByUrlRequest &request) const
1257 {
1258 auto outcome = BASE::AttemptRequest(endpoint_, request, Http::Method::Get);
1259 if (outcome.isSuccess()) {
1260 return GetObjectOutcome(GetObjectResult("", "",
1261 outcome.result()->Body(),
1262 outcome.result()->Headers()));
1263 }
1264 else {
1265 return GetObjectOutcome(buildError(outcome.error()));
1266 }
1267 }
1268
PutObjectByUrl(const PutObjectByUrlRequest & request) const1269 PutObjectOutcome OssClientImpl::PutObjectByUrl(const PutObjectByUrlRequest &request) const
1270 {
1271 auto outcome = BASE::AttemptRequest(endpoint_, request, Http::Method::Put);
1272 if (outcome.isSuccess()) {
1273 return PutObjectOutcome(PutObjectResult(outcome.result()->Headers(),
1274 outcome.result()->Body()));
1275 }
1276 else {
1277 return PutObjectOutcome(buildError(outcome.error()));
1278 }
1279 }
1280
InitiateMultipartUpload(const InitiateMultipartUploadRequest & request) const1281 InitiateMultipartUploadOutcome OssClientImpl::InitiateMultipartUpload(const InitiateMultipartUploadRequest &request) const
1282 {
1283 auto outcome = MakeRequest(request, Http::Post);
1284 if(outcome.isSuccess()){
1285 InitiateMultipartUploadResult result(outcome.result().payload());
1286 result.requestId_ = outcome.result().RequestId();
1287 return result.ParseDone() ? InitiateMultipartUploadOutcome(std::move(result)):
1288 InitiateMultipartUploadOutcome(
1289 OssError("InitiateMultipartUploadError",
1290 "Parsing InitiateMultipartUploadResult fail"));
1291 }
1292 else{
1293 return InitiateMultipartUploadOutcome(outcome.error());
1294 }
1295 }
1296
UploadPart(const UploadPartRequest & request) const1297 PutObjectOutcome OssClientImpl::UploadPart(const UploadPartRequest &request)const
1298 {
1299 auto outcome = MakeRequest(request, Http::Put);
1300 if(outcome.isSuccess()){
1301 const HeaderCollection& header = outcome.result().headerCollection();
1302 return PutObjectOutcome(PutObjectResult(header));
1303 }else{
1304 return PutObjectOutcome(outcome.error());
1305 }
1306 }
1307
UploadPartCopy(const UploadPartCopyRequest & request) const1308 UploadPartCopyOutcome OssClientImpl::UploadPartCopy(const UploadPartCopyRequest &request) const
1309 {
1310 auto outcome = MakeRequest(request, Http::Put);
1311 if(outcome.isSuccess()){
1312 const HeaderCollection& header = outcome.result().headerCollection();
1313 return UploadPartCopyOutcome(
1314 UploadPartCopyResult(outcome.result().payload(), header));
1315 }
1316 else{
1317 return UploadPartCopyOutcome(outcome.error());
1318 }
1319 }
1320
CompleteMultipartUpload(const CompleteMultipartUploadRequest & request) const1321 CompleteMultipartUploadOutcome OssClientImpl::CompleteMultipartUpload(const CompleteMultipartUploadRequest &request) const
1322 {
1323 auto outcome = MakeRequest(request, Http::Post);
1324 if (outcome.isSuccess()){
1325 CompleteMultipartUploadResult result(outcome.result().payload(), outcome.result().headerCollection());
1326 result.requestId_ = outcome.result().RequestId();
1327 return result.ParseDone() ?
1328 CompleteMultipartUploadOutcome(std::move(result)) :
1329 CompleteMultipartUploadOutcome(OssError("CompleteMultipartUpload", ""));
1330 }
1331 else {
1332 return CompleteMultipartUploadOutcome(outcome.error());
1333 }
1334 }
1335
AbortMultipartUpload(const AbortMultipartUploadRequest & request) const1336 VoidOutcome OssClientImpl::AbortMultipartUpload(const AbortMultipartUploadRequest &request) const
1337 {
1338 auto outcome = MakeRequest(request, Http::Delete);
1339 if(outcome.isSuccess()){
1340 VoidResult result;
1341 result.requestId_ = outcome.result().RequestId();
1342 return VoidOutcome(result);
1343 }
1344 else {
1345 return VoidOutcome(outcome.error());
1346 }
1347 }
1348
ListMultipartUploads(const ListMultipartUploadsRequest & request) const1349 ListMultipartUploadsOutcome OssClientImpl::ListMultipartUploads(
1350 const ListMultipartUploadsRequest &request) const
1351 {
1352 auto outcome = MakeRequest(request, Http::Get);
1353 if(outcome.isSuccess())
1354 {
1355 ListMultipartUploadsResult result(outcome.result().payload());
1356 result.requestId_ = outcome.result().RequestId();
1357 return result.ParseDone() ?
1358 ListMultipartUploadsOutcome(std::move(result)) :
1359 ListMultipartUploadsOutcome(OssError("ListMultipartUploads", "Parse Error"));
1360 }
1361 else {
1362 return ListMultipartUploadsOutcome(outcome.error());
1363 }
1364 }
1365
ListParts(const ListPartsRequest & request) const1366 ListPartsOutcome OssClientImpl::ListParts(const ListPartsRequest &request) const
1367 {
1368 auto outcome = MakeRequest(request, Http::Get);
1369 if(outcome.isSuccess())
1370 {
1371 ListPartsResult result(outcome.result().payload());
1372 result.requestId_ = outcome.result().RequestId();
1373 return result.ParseDone() ?
1374 ListPartsOutcome(std::move(result)) :
1375 ListPartsOutcome(OssError("ListParts", "Parse Error"));
1376 }else{
1377 return ListPartsOutcome(outcome.error());
1378 }
1379 }
1380
1381 #if !defined(OSS_DISABLE_RESUAMABLE)
1382 /*Resumable Operation*/
ResumableUploadObject(const UploadObjectRequest & request) const1383 PutObjectOutcome OssClientImpl::ResumableUploadObject(const UploadObjectRequest& request) const
1384 {
1385 const auto& reqeustBase = static_cast<const OssResumableBaseRequest &>(request);
1386 int code = reqeustBase.validate();
1387 if (code != 0) {
1388 return PutObjectOutcome(OssError("ValidateError", reqeustBase.validateMessage(code)));
1389 }
1390
1391 if (request.ObjectSize() <= request.PartSize())
1392 {
1393 auto content = GetFstreamByPath(request.FilePath(), request.FilePathW(),
1394 std::ios::in | std::ios::binary);
1395 PutObjectRequest putObjectReq(request.Bucket(), request.Key(), content, request.MetaData());
1396 if (request.TransferProgress().Handler) {
1397 putObjectReq.setTransferProgress(request.TransferProgress());
1398 }
1399 if (request.RequestPayer() == RequestPayer::Requester) {
1400 putObjectReq.setRequestPayer(request.RequestPayer());
1401 }
1402 if (request.TrafficLimit() != 0) {
1403 putObjectReq.setTrafficLimit(request.TrafficLimit());
1404 }
1405 return PutObject(putObjectReq);
1406 }
1407 else
1408 {
1409 ResumableUploader uploader(request, this);
1410 return uploader.Upload();
1411 }
1412 }
1413
ResumableCopyObject(const MultiCopyObjectRequest & request) const1414 CopyObjectOutcome OssClientImpl::ResumableCopyObject(const MultiCopyObjectRequest& request) const
1415 {
1416 const auto& reqeustBase = static_cast<const OssResumableBaseRequest &>(request);
1417 int code = reqeustBase.validate();
1418 if (code != 0) {
1419 return CopyObjectOutcome(OssError("ValidateError", reqeustBase.validateMessage(code)));
1420 }
1421
1422 auto getObjectMetaReq = GetObjectMetaRequest(request.SrcBucket(), request.SrcKey());
1423 if (request.RequestPayer() == RequestPayer::Requester) {
1424 getObjectMetaReq.setRequestPayer(request.RequestPayer());
1425 }
1426 if (!request.VersionId().empty()) {
1427 getObjectMetaReq.setVersionId(request.VersionId());
1428 }
1429 auto outcome = GetObjectMeta(getObjectMetaReq);
1430 if (!outcome.isSuccess()) {
1431 return CopyObjectOutcome(outcome.error());
1432 }
1433
1434 auto objectSize = outcome.result().ContentLength();
1435 if (objectSize < (int64_t)request.PartSize()) {
1436 auto copyObjectReq = CopyObjectRequest(request.Bucket(), request.Key(), request.MetaData());
1437 copyObjectReq.setCopySource(request.SrcBucket(), request.SrcKey());
1438 if (request.RequestPayer() == RequestPayer::Requester) {
1439 copyObjectReq.setRequestPayer(request.RequestPayer());
1440 }
1441 if (request.TrafficLimit() != 0) {
1442 copyObjectReq.setTrafficLimit(request.TrafficLimit());
1443 }
1444 if (!request.VersionId().empty()) {
1445 copyObjectReq.setVersionId(request.VersionId());
1446 }
1447 return CopyObject(copyObjectReq);
1448 }
1449
1450 ResumableCopier copier(request, this, objectSize);
1451 return copier.Copy();
1452 }
1453
ResumableDownloadObject(const DownloadObjectRequest & request) const1454 GetObjectOutcome OssClientImpl::ResumableDownloadObject(const DownloadObjectRequest &request) const
1455 {
1456 const auto& reqeustBase = static_cast<const OssResumableBaseRequest &>(request);
1457 int code = reqeustBase.validate();
1458 if (code != 0) {
1459 return GetObjectOutcome(OssError("ValidateError", reqeustBase.validateMessage(code)));
1460 }
1461
1462 auto getObjectMetaReq = GetObjectMetaRequest(request.Bucket(), request.Key());
1463 if (request.RequestPayer() == RequestPayer::Requester) {
1464 getObjectMetaReq.setRequestPayer(request.RequestPayer());
1465 }
1466 if (!request.VersionId().empty()) {
1467 getObjectMetaReq.setVersionId(request.VersionId());
1468 }
1469 auto hOutcome = GetObjectMeta(getObjectMetaReq);
1470 if (!hOutcome.isSuccess()) {
1471 return GetObjectOutcome(hOutcome.error());
1472 }
1473
1474 auto objectSize = hOutcome.result().ContentLength();
1475 if (objectSize < (int64_t)request.PartSize()) {
1476 auto getObjectReq = GetObjectRequest(request.Bucket(), request.Key(), request.ModifiedSinceConstraint(), request.UnmodifiedSinceConstraint(),request.MatchingETagsConstraint(), request.NonmatchingETagsConstraint(), request.ResponseHeaderParameters());
1477 if (request.RangeIsSet()) {
1478 getObjectReq.setRange(request.RangeStart(), request.RangeEnd());
1479 }
1480 if (request.TransferProgress().Handler) {
1481 getObjectReq.setTransferProgress(request.TransferProgress());
1482 }
1483 if (request.RequestPayer() == RequestPayer::Requester) {
1484 getObjectReq.setRequestPayer(request.RequestPayer());
1485 }
1486 if (request.TrafficLimit() != 0) {
1487 getObjectReq.setTrafficLimit(request.TrafficLimit());
1488 }
1489 if (!request.VersionId().empty()) {
1490 getObjectReq.setVersionId(request.VersionId());
1491 }
1492 getObjectReq.setResponseStreamFactory([=]() {
1493 return GetFstreamByPath(request.FilePath(), request.FilePathW(),
1494 std::ios_base::out | std::ios_base::in | std::ios_base::trunc | std::ios_base::binary);
1495 });
1496 auto outcome = this->GetObject(getObjectReq);
1497 std::shared_ptr<std::iostream> content = nullptr;
1498 outcome.result().setContent(content);
1499 if (IsFileExist(request.TempFilePath())) {
1500 RemoveFile(request.TempFilePath());
1501 }
1502 #ifdef _WIN32
1503 else if (IsFileExist(request.TempFilePathW())) {
1504 RemoveFile(request.TempFilePathW());
1505 }
1506 #endif
1507 return outcome;
1508 }
1509
1510 ResumableDownloader downloader(request, this, objectSize);
1511 return downloader.Download();
1512 }
1513 #endif
1514
1515 #if !defined(OSS_DISABLE_LIVECHANNEL)
1516 /*Live Channel*/
PutLiveChannelStatus(const PutLiveChannelStatusRequest & request) const1517 VoidOutcome OssClientImpl::PutLiveChannelStatus(const PutLiveChannelStatusRequest& request) const
1518 {
1519 auto outcome = MakeRequest(request, Http::Put);
1520 if(outcome.isSuccess())
1521 {
1522 VoidResult result;
1523 result.requestId_ = outcome.result().RequestId();
1524 return VoidOutcome(result);
1525 }else{
1526 return VoidOutcome(outcome.error());
1527 }
1528 }
1529
PutLiveChannel(const PutLiveChannelRequest & request) const1530 PutLiveChannelOutcome OssClientImpl::PutLiveChannel(const PutLiveChannelRequest& request) const
1531 {
1532 auto outcome = MakeRequest(request, Http::Put);
1533 if(outcome.isSuccess())
1534 {
1535 PutLiveChannelResult result(outcome.result().payload());
1536 result.requestId_ = outcome.result().RequestId();
1537 return result.ParseDone()?
1538 PutLiveChannelOutcome(std::move(result)):
1539 PutLiveChannelOutcome(OssError("PutLiveChannelError", "Parse Error"));
1540 }else{
1541 return PutLiveChannelOutcome(outcome.error());
1542 }
1543 }
1544
PostVodPlaylist(const PostVodPlaylistRequest & request) const1545 VoidOutcome OssClientImpl::PostVodPlaylist(const PostVodPlaylistRequest &request) const
1546 {
1547 auto outcome = MakeRequest(request, Http::Post);
1548 if(outcome.isSuccess())
1549 {
1550 VoidResult result;
1551 result.requestId_ = outcome.result().RequestId();
1552 return VoidOutcome(std::move(result));
1553 }else{
1554 return VoidOutcome(outcome.error());
1555 }
1556 }
1557
GetVodPlaylist(const GetVodPlaylistRequest & request) const1558 GetVodPlaylistOutcome OssClientImpl::GetVodPlaylist(const GetVodPlaylistRequest &request) const
1559 {
1560 auto outcome = MakeRequest(request, Http::Get);
1561 if(outcome.isSuccess())
1562 {
1563 GetVodPlaylistResult result(outcome.result().payload());
1564 result.requestId_ = outcome.result().RequestId();
1565 return GetVodPlaylistOutcome(std::move(result));
1566 }else{
1567 return GetVodPlaylistOutcome(outcome.error());
1568 }
1569 }
1570
GetLiveChannelStat(const GetLiveChannelStatRequest & request) const1571 GetLiveChannelStatOutcome OssClientImpl::GetLiveChannelStat(const GetLiveChannelStatRequest &request) const
1572 {
1573 auto outcome = MakeRequest(request, Http::Get);
1574 if(outcome.isSuccess())
1575 {
1576 GetLiveChannelStatResult result(outcome.result().payload());
1577 result.requestId_ = outcome.result().RequestId();
1578 return result.ParseDone()?
1579 GetLiveChannelStatOutcome(std::move(result)):
1580 GetLiveChannelStatOutcome(OssError("GetLiveChannelStatError", "Parse Error"));
1581 }else{
1582 return GetLiveChannelStatOutcome(outcome.error());
1583 }
1584 }
1585
GetLiveChannelInfo(const GetLiveChannelInfoRequest & request) const1586 GetLiveChannelInfoOutcome OssClientImpl::GetLiveChannelInfo(const GetLiveChannelInfoRequest &request) const
1587 {
1588 auto outcome = MakeRequest(request, Http::Get);
1589 if(outcome.isSuccess())
1590 {
1591 GetLiveChannelInfoResult result(outcome.result().payload());
1592 result.requestId_ = outcome.result().RequestId();
1593 return result.ParseDone()?
1594 GetLiveChannelInfoOutcome(std::move(result)):
1595 GetLiveChannelInfoOutcome(OssError("GetLiveChannelStatError", "Parse Error"));
1596 }else{
1597 return GetLiveChannelInfoOutcome(outcome.error());
1598 }
1599 }
1600
GetLiveChannelHistory(const GetLiveChannelHistoryRequest & request) const1601 GetLiveChannelHistoryOutcome OssClientImpl::GetLiveChannelHistory(const GetLiveChannelHistoryRequest &request) const
1602 {
1603 auto outcome = MakeRequest(request, Http::Get);
1604 if(outcome.isSuccess())
1605 {
1606 GetLiveChannelHistoryResult result(outcome.result().payload());
1607 result.requestId_ = outcome.result().RequestId();
1608 return result.ParseDone()?
1609 GetLiveChannelHistoryOutcome(std::move(result)):
1610 GetLiveChannelHistoryOutcome(OssError("GetLiveChannelStatError", "Parse Error"));
1611 }else{
1612 return GetLiveChannelHistoryOutcome(outcome.error());
1613 }
1614 }
1615
ListLiveChannel(const ListLiveChannelRequest & request) const1616 ListLiveChannelOutcome OssClientImpl::ListLiveChannel(const ListLiveChannelRequest &request) const
1617 {
1618 auto outcome = MakeRequest(request, Http::Get);
1619 if(outcome.isSuccess())
1620 {
1621 ListLiveChannelResult result(outcome.result().payload());
1622 result.requestId_ = outcome.result().RequestId();
1623 return result.ParseDone()?
1624 ListLiveChannelOutcome(std::move(result)):
1625 ListLiveChannelOutcome(OssError("GetLiveChannelStatError", "Parse Error"));
1626 }else{
1627 return ListLiveChannelOutcome(outcome.error());
1628 }
1629 }
1630
DeleteLiveChannel(const DeleteLiveChannelRequest & request) const1631 VoidOutcome OssClientImpl::DeleteLiveChannel(const DeleteLiveChannelRequest &request) const
1632 {
1633 auto outcome = MakeRequest(request, Http::Delete);
1634 if(outcome.isSuccess())
1635 {
1636 VoidResult result;
1637 result.requestId_ = outcome.result().RequestId();
1638 return VoidOutcome(std::move(result));
1639 }else{
1640 return VoidOutcome(outcome.error());
1641 }
1642 }
1643
GenerateRTMPSignedUrl(const GenerateRTMPSignedUrlRequest & request) const1644 StringOutcome OssClientImpl::GenerateRTMPSignedUrl(const GenerateRTMPSignedUrlRequest &request) const
1645 {
1646 if (!IsValidBucketName(request.bucket_) ||
1647 !IsValidChannelName(request.ChannelName()) ||
1648 !IsValidPlayListName(request.PlayList()) ||
1649 0 == request.Expires()) {
1650 return StringOutcome(OssError("ValidateError", "The Bucket or ChannelName or "
1651 "PlayListName or Expires is invalid."));
1652 }
1653
1654 ParameterCollection parameters;
1655 const Credentials credentials = credentialsProvider_->getCredentials();
1656 if (!credentials.SessionToken().empty()) {
1657 parameters["security-token"] = credentials.SessionToken();
1658 }
1659
1660 parameters = request.Parameters();
1661
1662 std::string expireStr;
1663 std::stringstream ss;
1664 ss << request.Expires();
1665 expireStr = ss.str();
1666
1667 SignUtils signUtils(signer_->version());
1668 auto resource = std::string().append("/").append(request.Bucket()).append("/").append(request.ChannelName());
1669 signUtils.build(expireStr, resource, parameters);
1670 auto signature = signer_->generate(signUtils.CanonicalString(), credentials.AccessKeySecret());
1671 parameters["Expires"] = expireStr;
1672 parameters["OSSAccessKeyId"] = credentials.AccessKeyId();
1673 parameters["Signature"] = signature;
1674
1675 ss.str("");
1676 ss << CombineRTMPString(endpoint_, request.bucket_, configuration().isCname);
1677 ss << "/live";
1678 ss << CombinePathString(endpoint_, request.bucket_, request.key_);
1679 ss << "?";
1680 ss << CombineQueryString(parameters);
1681
1682 return StringOutcome(ss.str());
1683 }
1684 #endif
1685
1686 /*Requests control*/
DisableRequest()1687 void OssClientImpl::DisableRequest()
1688 {
1689 BASE::disableRequest();
1690 OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) DisableRequest", this);
1691 }
1692
EnableRequest()1693 void OssClientImpl::EnableRequest()
1694 {
1695 BASE::enableRequest();
1696 OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) EnableRequest", this);
1697 }
1698