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, &currentTime);
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&param : 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&param : 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