diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7194ea7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.cache +build diff --git a/CMakeLists.txt b/CMakeLists.txt index ea0d8d6..0727759 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,7 @@ option(BUILD_SAMPLE "Build sample" ON) option(BUILD_TESTS "Build unit and perfermence tests" OFF) option(ENABLE_COVERAGE "Flag to enable/disable building code with -fprofile-arcs and -ftest-coverage. Gcc only" OFF) option(ENABLE_RTTI "Flag to enable/disable building code with RTTI information" ON) - +option(USE_CPP20 "Use C++ 20 coroutine" OFF) #Platform if (CMAKE_CROSSCOMPILING) @@ -127,6 +127,18 @@ else() endif() endif() +if (USE_CPP20) + message("Use C++20 coroutine") + # GCC coroutine flags + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines") + #-ftree-slp-vectorize with coroutine cause link error. disable it util gcc fix. + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-tree-slp-vectorize") + endif() + #Compiler flags + list(APPEND SDK_COMPILER_FLAGS "-std=c++20") + add_compile_definitions(USE_CPP20) +endif() if (BUILD_SHARED_LIBS) set(STATIC_LIB_SUFFIX "-static") @@ -146,4 +158,4 @@ endif() if(BUILD_TESTS) add_subdirectory(test) add_subdirectory(ptest) -endif() +endif() \ No newline at end of file diff --git a/sample/src/bucket/BucketSample.cc b/sample/src/bucket/BucketSample.cc index 8ee3edd..2e9290b 100644 --- a/sample/src/bucket/BucketSample.cc +++ b/sample/src/bucket/BucketSample.cc @@ -1,6 +1,9 @@ -#include -#include "../Config.h" #include "BucketSample.h" +#include "../Config.h" +#include +#include +#include + #ifdef _WIN32 #include #else @@ -9,564 +12,579 @@ using namespace AlibabaCloud::OSS; -static void waitTimeinSec(int time) -{ +static void waitTimeinSec(int time) { #ifdef _WIN32 - Sleep(time * 1000); + Sleep(time * 1000); #else - sleep(time); + sleep(time); #endif } -BucketSample::BucketSample(const std::string &bucket): - bucket_(bucket) -{ - ClientConfiguration conf; - client = new OssClient(Config::Endpoint, Config::AccessKeyId, Config::AccessKeySecret, conf); - CreateBucketRequest request(bucket_); - client->CreateBucket(request); +#ifdef USE_CPP20 +async_simple::coro::Lazy BucketSample::test_coro_lazy( + const AlibabaCloud::OSS::CreateBucketRequest &request) { + co_await client->CreateBucketAsync(request); } +#endif -BucketSample::~BucketSample() { - delete client; -} +BucketSample::BucketSample(const std::string &bucket) : bucket_(bucket) { + ClientConfiguration conf; -void BucketSample::PrintError(const std::string &funcName, const OssError &error) -{ - std::cout << funcName << " fail" << - ",code:" << error.Code() << - ",message:" << error.Message() << - ",request_id:" << error.RequestId() << std::endl; -} + client = new OssClient(Config::Endpoint, Config::AccessKeyId, + Config::AccessKeySecret, conf); + CreateBucketRequest request(bucket_); -void BucketSample::InvalidBucketName() -{ - SetBucketAclRequest request("invalid-BucketName", CannedAccessControlList::Private); - auto outcome = client->SetBucketAcl(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " to private success " << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - SetBucketLoggingRequest log_request("invalid-BucketName", bucket_, "LogPrefix"); - auto log_outcome = client->SetBucketLogging(log_request); - if (log_outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success " << std::endl; - } - else { - PrintError(__FUNCTION__, log_outcome.error()); - } + // #ifdef USE_CPP20 + // async_simple::coro::syncAwait(test_coro_lazy(request)); + // #else + client->CreateBucket(request); + // #endif } -void BucketSample::CreateAndDeleteBucket() -{ - std::string bucket = bucket_ + "-createbucketsample"; - CreateBucketRequest request(bucket, StorageClass::IA, CannedAccessControlList::PublicReadWrite); - auto outcome = client->CreateBucket(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " create bucket success " << std::endl; - } else { - PrintError(__FUNCTION__, outcome.error()); - } +BucketSample::~BucketSample() { delete client; } - DeleteBucketRequest drequest(bucket); - auto doutcome = client->DeleteBucket(drequest); - if (doutcome.isSuccess()) { - std::cout << __FUNCTION__ << " delete bucket success " << std::endl; - } - else { - PrintError(__FUNCTION__, doutcome.error()); - } +void BucketSample::PrintError(const std::string &funcName, + const OssError &error) { + std::cout << funcName << " fail" + << ",code:" << error.Code() << ",message:" << error.Message() + << ",request_id:" << error.RequestId() << std::endl; } -void BucketSample::SetBucketAcl() -{ - SetBucketAclRequest request(bucket_, CannedAccessControlList::Private); - auto outcome = client->SetBucketAcl(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " to private success " << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - request.setAcl(CannedAccessControlList::PublicReadWrite); - auto outcome1 = client->SetBucketAcl(request); - if (outcome1.isSuccess()) { - std::cout << __FUNCTION__ << " to public-read-write success " << std::endl; - } - else { - PrintError(__FUNCTION__, outcome1.error()); - } +void BucketSample::InvalidBucketName() { + SetBucketAclRequest request("invalid-BucketName", + CannedAccessControlList::Private); + auto outcome = client->SetBucketAcl(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " to private success " << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + SetBucketLoggingRequest log_request("invalid-BucketName", bucket_, + "LogPrefix"); + auto log_outcome = client->SetBucketLogging(log_request); + if (log_outcome.isSuccess()) { + std::cout << __FUNCTION__ << " success " << std::endl; + } else { + PrintError(__FUNCTION__, log_outcome.error()); + } } -void BucketSample::SetBucketLogging() -{ - SetBucketLoggingRequest request(bucket_, bucket_, "LogPrefix"); - auto outcome = client->SetBucketLogging(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, request_id:" << outcome.result().RequestId().c_str() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::CreateAndDeleteBucket() { + std::string bucket = bucket_ + "-createbucketsample"; + CreateBucketRequest request(bucket, StorageClass::IA, + CannedAccessControlList::PublicReadWrite); + auto outcome = client->CreateBucket(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " create bucket success " << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + DeleteBucketRequest drequest(bucket); + auto doutcome = client->DeleteBucket(drequest); + if (doutcome.isSuccess()) { + std::cout << __FUNCTION__ << " delete bucket success " << std::endl; + } else { + PrintError(__FUNCTION__, doutcome.error()); + } } -void BucketSample::SetBucketWebsite() -{ - SetBucketWebsiteRequest request(bucket_); - request.setIndexDocument("index.html"); - request.setIndexDocument("error.html"); - auto outcome = client->SetBucketWebsite(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, request_id:" << outcome.result().RequestId() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::SetBucketAcl() { + SetBucketAclRequest request(bucket_, CannedAccessControlList::Private); + auto outcome = client->SetBucketAcl(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " to private success " << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + request.setAcl(CannedAccessControlList::PublicReadWrite); + auto outcome1 = client->SetBucketAcl(request); + if (outcome1.isSuccess()) { + std::cout << __FUNCTION__ << " to public-read-write success " << std::endl; + } else { + PrintError(__FUNCTION__, outcome1.error()); + } } -void BucketSample::SetBucketReferer() -{ - SetBucketRefererRequest request(bucket_); - request.addReferer("http://www.referersample.com"); - request.addReferer("https://www.referersample.com"); - request.addReferer("https://www.?.referersample.com"); - request.addReferer("https://www.*.cn"); - auto outcome = client->SetBucketReferer(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, request_id:" << outcome.result().RequestId() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::SetBucketLogging() { + SetBucketLoggingRequest request(bucket_, bucket_, "LogPrefix"); + auto outcome = client->SetBucketLogging(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, request_id:" << outcome.result().RequestId().c_str() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::SetBucketLifecycle() -{ - SetBucketLifecycleRequest request(bucket_); - std::string date("2022 - 10 - 12T00:00 : 00.000Z"); - - auto rule1 = LifecycleRule(); - rule1.setID("rule1"); - rule1.setPrefix("test/"); - rule1.setStatus(RuleStatus::Enabled); - rule1.setExpiration(3); - - auto rule2 = LifecycleRule(); - rule2.setID("rule2"); - rule2.setPrefix("test/"); - rule2.setStatus(RuleStatus::Disabled); - rule2.setExpiration(date); - - auto rule3 = LifecycleRule(); - rule3.setID("rule3"); - rule3.setPrefix("test1/"); - rule3.setStatus(RuleStatus::Enabled); - rule3.setAbortMultipartUpload(3); - - auto rule4 = LifecycleRule(); - rule4.setID("rule4"); - rule4.setPrefix("test1/"); - rule4.setStatus(RuleStatus::Enabled); - rule4.setAbortMultipartUpload(date); - - LifecycleRuleList list{rule1, rule2, rule3, rule4}; - request.setLifecycleRules(list); - auto outcome = client->SetBucketLifecycle(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, request_id:" << outcome.result().RequestId() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::SetBucketWebsite() { + SetBucketWebsiteRequest request(bucket_); + request.setIndexDocument("index.html"); + request.setIndexDocument("error.html"); + auto outcome = client->SetBucketWebsite(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, request_id:" << outcome.result().RequestId() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::SetBucketCors() -{ - SetBucketCorsRequest request(bucket_); - auto rule1 = CORSRule(); - // Note: AllowedOrigin & AllowdMethod must not be empty. - rule1.addAllowedOrigin("http://www.a.com"); - rule1.addAllowedMethod("POST"); - rule1.addAllowedHeader("*"); - rule1.addExposeHeader("x-oss-test"); - request.addCORSRule(rule1); - - auto rule2 = CORSRule(); - rule2.addAllowedOrigin("http://www.b.com"); - rule2.addAllowedMethod("GET"); - rule2.addExposeHeader("x-oss-test2"); - rule2.setMaxAgeSeconds(100); - request.addCORSRule(rule2); - - auto outcome = client->SetBucketCors(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, request_id:" << outcome.result().RequestId() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::SetBucketReferer() { + SetBucketRefererRequest request(bucket_); + request.addReferer("http://www.referersample.com"); + request.addReferer("https://www.referersample.com"); + request.addReferer("https://www.?.referersample.com"); + request.addReferer("https://www.*.cn"); + auto outcome = client->SetBucketReferer(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, request_id:" << outcome.result().RequestId() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::DeleteBucketLogging() -{ - DeleteBucketLoggingRequest request(bucket_); - auto outcome = client->DeleteBucketLogging(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, request_id:" << outcome.result().RequestId() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::SetBucketLifecycle() { + SetBucketLifecycleRequest request(bucket_); + std::string date("2022 - 10 - 12T00:00 : 00.000Z"); + + auto rule1 = LifecycleRule(); + rule1.setID("rule1"); + rule1.setPrefix("test/"); + rule1.setStatus(RuleStatus::Enabled); + rule1.setExpiration(3); + + auto rule2 = LifecycleRule(); + rule2.setID("rule2"); + rule2.setPrefix("test/"); + rule2.setStatus(RuleStatus::Disabled); + rule2.setExpiration(date); + + auto rule3 = LifecycleRule(); + rule3.setID("rule3"); + rule3.setPrefix("test1/"); + rule3.setStatus(RuleStatus::Enabled); + rule3.setAbortMultipartUpload(3); + + auto rule4 = LifecycleRule(); + rule4.setID("rule4"); + rule4.setPrefix("test1/"); + rule4.setStatus(RuleStatus::Enabled); + rule4.setAbortMultipartUpload(date); + + LifecycleRuleList list{rule1, rule2, rule3, rule4}; + request.setLifecycleRules(list); + auto outcome = client->SetBucketLifecycle(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, request_id:" << outcome.result().RequestId() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::DeleteBucketWebsite() -{ - DeleteBucketWebsiteRequest request(bucket_); - auto outcome = client->DeleteBucketWebsite(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, request_id:" << outcome.result().RequestId() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::SetBucketCors() { + SetBucketCorsRequest request(bucket_); + auto rule1 = CORSRule(); + // Note: AllowedOrigin & AllowdMethod must not be empty. + rule1.addAllowedOrigin("http://www.a.com"); + rule1.addAllowedMethod("POST"); + rule1.addAllowedHeader("*"); + rule1.addExposeHeader("x-oss-test"); + request.addCORSRule(rule1); + + auto rule2 = CORSRule(); + rule2.addAllowedOrigin("http://www.b.com"); + rule2.addAllowedMethod("GET"); + rule2.addExposeHeader("x-oss-test2"); + rule2.setMaxAgeSeconds(100); + request.addCORSRule(rule2); + + auto outcome = client->SetBucketCors(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, request_id:" << outcome.result().RequestId() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::DeleteBucketLifecycle() -{ - DeleteBucketLifecycleRequest request(bucket_); - auto outcome = client->DeleteBucketLifecycle(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, request_id:" << outcome.result().RequestId() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::DeleteBucketLogging() { + DeleteBucketLoggingRequest request(bucket_); + auto outcome = client->DeleteBucketLogging(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, request_id:" << outcome.result().RequestId() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::DeleteBucketCors() -{ - auto outcome = client->DeleteBucketCors(bucket_); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, request_id:" << outcome.result().RequestId() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::DeleteBucketWebsite() { + DeleteBucketWebsiteRequest request(bucket_); + auto outcome = client->DeleteBucketWebsite(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, request_id:" << outcome.result().RequestId() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::GetBucketAcl() -{ - GetBucketAclRequest request(bucket_); - auto outcome = client->GetBucketAcl(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, ori acl: " << outcome.result().Acl() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - SetBucketAclRequest request1(bucket_, CannedAccessControlList::PublicRead); - client->SetBucketAcl(request1); - waitTimeinSec(1); - - outcome = client->GetBucketAcl(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, after set public-read, acl:" << outcome.result().Acl() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::DeleteBucketLifecycle() { + DeleteBucketLifecycleRequest request(bucket_); + auto outcome = client->DeleteBucketLifecycle(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, request_id:" << outcome.result().RequestId() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::GetBucketLocation() -{ - GetBucketLocationRequest request(bucket_); - auto outcome = client->GetBucketLocation(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, location: " << outcome.result().Location() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - outcome = client->GetBucketLocation(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, location: " << outcome.result().Location() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::DeleteBucketCors() { + auto outcome = client->DeleteBucketCors(bucket_); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, request_id:" << outcome.result().RequestId() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::GetBucketLogging() -{ - GetBucketLoggingRequest request(bucket_); - auto outcome = client->GetBucketLogging(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, default TargetBucket: " << outcome.result().TargetBucket() << - ",TargetPrefix: " << outcome.result().TargetPrefix() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - SetBucketLoggingRequest request1(bucket_, bucket_, "LogPrefix-00"); - client->SetBucketLogging(request1); - waitTimeinSec(1); - - outcome = client->GetBucketLogging(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, after set itself with LogPrefix-00 , TargetBucket: " << outcome.result().TargetBucket() << - " ,TargetPrefix: " << outcome.result().TargetPrefix() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - std::string bucket_01 = bucket_ + "01"; - CreateBucketRequest request0(bucket_01); - client->CreateBucket(request0); - - SetBucketLoggingRequest request2(bucket_, bucket_01, "LogPrefix-01"); - client->SetBucketLogging(request2); - waitTimeinSec(1); - - outcome = client->GetBucketLogging(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, after set other with LogPrefix-01 TargetBucket: " << outcome.result().TargetBucket() << - " ,TargetPrefix: " << outcome.result().TargetPrefix() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::GetBucketAcl() { + GetBucketAclRequest request(bucket_); + auto outcome = client->GetBucketAcl(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " success, ori acl: " << outcome.result().Acl() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + SetBucketAclRequest request1(bucket_, CannedAccessControlList::PublicRead); + client->SetBucketAcl(request1); + waitTimeinSec(1); + + outcome = client->GetBucketAcl(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " success, after set public-read, acl:" + << outcome.result().Acl() << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::GetBucketWebsite() -{ - GetBucketWebsiteRequest request(bucket_); - auto outcome = client->GetBucketWebsite(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, default, IndexDocument: " << outcome.result().IndexDocument() << - " ,ErrorDocument: " << outcome.result().ErrorDocument() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - SetBucketWebsiteRequest request0(bucket_); - request0.setIndexDocument("index.html"); - client->SetBucketWebsite(request0); - waitTimeinSec(15); - - outcome = client->GetBucketWebsite(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, after set index.html, IndexDocument: " << outcome.result().IndexDocument() << - " ,ErrorDocument: " << outcome.result().ErrorDocument() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - request0.setIndexDocument("index1.html"); - request0.setErrorDocument("error1.html"); - client->SetBucketWebsite(request0); - waitTimeinSec(15); - - outcome = client->GetBucketWebsite(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, after set index1.html, error1.html,IndexDocument: " << outcome.result().IndexDocument() << - " ,ErrorDocument: " << outcome.result().ErrorDocument() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::GetBucketLocation() { + GetBucketLocationRequest request(bucket_); + auto outcome = client->GetBucketLocation(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, location: " << outcome.result().Location() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + outcome = client->GetBucketLocation(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, location: " << outcome.result().Location() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::GetBucketReferer() -{ - GetBucketRefererRequest request(bucket_); - auto outcome = client->GetBucketReferer(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, deffault AllowEmptyReferer: " << outcome.result().AllowEmptyReferer() << - " ,Referer size: " << outcome.result().RefererList().size() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - SetBucketRefererRequest request0(bucket_); - request0.addReferer("http://www.referersample.com"); - request0.addReferer("https://www.referersample.com"); - request0.addReferer("https://www.?.referersample.com"); - request0.addReferer("https://www.*.cn"); - client->SetBucketReferer(request0); - waitTimeinSec(15); - - outcome = client->GetBucketReferer(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, after set 4 refer, AllowEmptyReferer: " << outcome.result().AllowEmptyReferer() << - " ,Referer size: " << outcome.result().RefererList().size() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } - - - request0.clearRefererList(); - request0.addReferer("https://www.?.referersample.com"); - request0.addReferer("https://www.*.cn"); - client->SetBucketReferer(request0); - waitTimeinSec(15); +void BucketSample::GetBucketLogging() { + GetBucketLoggingRequest request(bucket_); + auto outcome = client->GetBucketLogging(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " success, default TargetBucket: " + << outcome.result().TargetBucket() + << ",TargetPrefix: " << outcome.result().TargetPrefix() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + SetBucketLoggingRequest request1(bucket_, bucket_, "LogPrefix-00"); + client->SetBucketLogging(request1); + waitTimeinSec(1); + + outcome = client->GetBucketLogging(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, after set itself with LogPrefix-00 , TargetBucket: " + << outcome.result().TargetBucket() + << " ,TargetPrefix: " << outcome.result().TargetPrefix() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + std::string bucket_01 = bucket_ + "01"; + CreateBucketRequest request0(bucket_01); + client->CreateBucket(request0); + + SetBucketLoggingRequest request2(bucket_, bucket_01, "LogPrefix-01"); + client->SetBucketLogging(request2); + waitTimeinSec(1); + + outcome = client->GetBucketLogging(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, after set other with LogPrefix-01 TargetBucket: " + << outcome.result().TargetBucket() + << " ,TargetPrefix: " << outcome.result().TargetPrefix() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } +} - outcome = client->GetBucketReferer(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, after set 2 refer, AllowEmptyReferer: " << outcome.result().AllowEmptyReferer() << - " ,Referer size: " << outcome.result().RefererList().size() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::GetBucketWebsite() { + GetBucketWebsiteRequest request(bucket_); + auto outcome = client->GetBucketWebsite(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " success, default, IndexDocument: " + << outcome.result().IndexDocument() + << " ,ErrorDocument: " << outcome.result().ErrorDocument() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + SetBucketWebsiteRequest request0(bucket_); + request0.setIndexDocument("index.html"); + client->SetBucketWebsite(request0); + waitTimeinSec(15); + + outcome = client->GetBucketWebsite(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, after set index.html, IndexDocument: " + << outcome.result().IndexDocument() + << " ,ErrorDocument: " << outcome.result().ErrorDocument() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + request0.setIndexDocument("index1.html"); + request0.setErrorDocument("error1.html"); + client->SetBucketWebsite(request0); + waitTimeinSec(15); + + outcome = client->GetBucketWebsite(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, after set index1.html, error1.html,IndexDocument: " + << outcome.result().IndexDocument() + << " ,ErrorDocument: " << outcome.result().ErrorDocument() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::GetBucketLifecycle() -{ - auto outcome = client->GetBucketLifecycle(bucket_); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, rule size:%d, rules:" << std::endl; - for (auto const& rule : outcome.result().LifecycleRules()) { - std::cout << "rule:" << rule.ID() << "," << rule.Prefix() << "," << rule.Status() << "," - "hasExpiration:" << rule.hasExpiration() << "," << - "hasTransitionList:" << rule.hasTransitionList() << "," << - "hasAbortMultipartUpload:" << rule.hasAbortMultipartUpload() << std::endl; - } - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::GetBucketReferer() { + GetBucketRefererRequest request(bucket_); + auto outcome = client->GetBucketReferer(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " success, deffault AllowEmptyReferer: " + << outcome.result().AllowEmptyReferer() + << " ,Referer size: " << outcome.result().RefererList().size() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + SetBucketRefererRequest request0(bucket_); + request0.addReferer("http://www.referersample.com"); + request0.addReferer("https://www.referersample.com"); + request0.addReferer("https://www.?.referersample.com"); + request0.addReferer("https://www.*.cn"); + client->SetBucketReferer(request0); + waitTimeinSec(15); + + outcome = client->GetBucketReferer(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, after set 4 refer, AllowEmptyReferer: " + << outcome.result().AllowEmptyReferer() + << " ,Referer size: " << outcome.result().RefererList().size() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } + + request0.clearRefererList(); + request0.addReferer("https://www.?.referersample.com"); + request0.addReferer("https://www.*.cn"); + client->SetBucketReferer(request0); + waitTimeinSec(15); + + outcome = client->GetBucketReferer(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, after set 2 refer, AllowEmptyReferer: " + << outcome.result().AllowEmptyReferer() + << " ,Referer size: " << outcome.result().RefererList().size() + << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::GetBucketStat() -{ - GetBucketStatRequest request(bucket_); - auto outcome = client->GetBucketStat(request); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success, storage: " << outcome.result().Storage() << - " ,ObjectCount: " << outcome.result().ObjectCount() << - " ,MultipartUploadCount:" << outcome.result().MultipartUploadCount() << std::endl; - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::GetBucketLifecycle() { + auto outcome = client->GetBucketLifecycle(bucket_); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " success, rule size:%d, rules:" << std::endl; + for (auto const &rule : outcome.result().LifecycleRules()) { + std::cout << "rule:" << rule.ID() << "," << rule.Prefix() << "," + << rule.Status() + << "," + "hasExpiration:" + << rule.hasExpiration() << "," + << "hasTransitionList:" << rule.hasTransitionList() << "," + << "hasAbortMultipartUpload:" << rule.hasAbortMultipartUpload() + << std::endl; + } + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::GetBucketCors() -{ - auto outcome = client->GetBucketCors(bucket_); - if (outcome.isSuccess()) { - std::cout << __FUNCTION__ << " success" << std::endl; - for (auto const& rule : outcome.result().CORSRules()) { - std::cout << "Get Bucket Cors List:" << std::endl; - for (auto const& origin : rule.AllowedOrigins()) { - std::cout << "Allowed origin:" << origin << std::endl; - } - } - } - else { - PrintError(__FUNCTION__, outcome.error()); - } +void BucketSample::GetBucketStat() { + GetBucketStatRequest request(bucket_); + auto outcome = client->GetBucketStat(request); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ + << " success, storage: " << outcome.result().Storage() + << " ,ObjectCount: " << outcome.result().ObjectCount() + << " ,MultipartUploadCount:" + << outcome.result().MultipartUploadCount() << std::endl; + } else { + PrintError(__FUNCTION__, outcome.error()); + } } -void BucketSample::CleanAndDeleteBucket(const std::string &bucket) -{ - if (!client->DoesBucketExist(bucket)) - return; - - //versioning - auto infoOutcome = client->GetBucketInfo(bucket); - if (infoOutcome.isSuccess() && infoOutcome.result().VersioningStatus() != VersioningStatus::NotSet) { - //list objects by ListObjectVersions and delete object with versionId - ListObjectVersionsRequest request(bucket); - bool IsTruncated = false; - do { - auto outcome = client->ListObjectVersions(request); - if (outcome.isSuccess()) { - for (auto const &marker : outcome.result().DeleteMarkerSummarys()) { - client->DeleteObject(DeleteObjectRequest(bucket, marker.Key(), marker.VersionId())); - } - - for (auto const &obj : outcome.result().ObjectVersionSummarys()) { - client->DeleteObject(DeleteObjectRequest(bucket, obj.Key(), obj.VersionId())); - } - } - else { - break; - } - request.setKeyMarker(outcome.result().NextKeyMarker()); - request.setVersionIdMarker(outcome.result().NextVersionIdMarker()); - - IsTruncated = outcome.result().IsTruncated(); - } while (IsTruncated); - } +void BucketSample::GetBucketCors() { + auto outcome = client->GetBucketCors(bucket_); + if (outcome.isSuccess()) { + std::cout << __FUNCTION__ << " success" << std::endl; + for (auto const &rule : outcome.result().CORSRules()) { + std::cout << "Get Bucket Cors List:" << std::endl; + for (auto const &origin : rule.AllowedOrigins()) { + std::cout << "Allowed origin:" << origin << std::endl; + } + } + } else { + PrintError(__FUNCTION__, outcome.error()); + } +} - //abort in progress multipart uploading - auto listOutcome = client->ListMultipartUploads(ListMultipartUploadsRequest(bucket)); - if (listOutcome.isSuccess()) { - for (auto const &upload : listOutcome.result().MultipartUploadList()) - { - client->AbortMultipartUpload(AbortMultipartUploadRequest(bucket, upload.Key, upload.UploadId)); - } - } +void BucketSample::CleanAndDeleteBucket(const std::string &bucket) { + if (!client->DoesBucketExist(bucket)) + return; - //List And Delete Object - ListObjectsRequest request(bucket); + // versioning + auto infoOutcome = client->GetBucketInfo(bucket); + if (infoOutcome.isSuccess() && + infoOutcome.result().VersioningStatus() != VersioningStatus::NotSet) { + // list objects by ListObjectVersions and delete object with versionId + ListObjectVersionsRequest request(bucket); bool IsTruncated = false; do { - auto outcome = client->ListObjects(request); - if (outcome.isSuccess()) { - for (auto const &obj : outcome.result().ObjectSummarys()) { - auto dOutcome = client->DeleteObject(DeleteObjectRequest(bucket, obj.Key())); - std::cout << __FUNCTION__ << "Delete Object:" << obj.Key() << - ", result:" << dOutcome.isSuccess() << std::endl; - } - } - else { - PrintError(__FUNCTION__, outcome.error()); - break; + auto outcome = client->ListObjectVersions(request); + if (outcome.isSuccess()) { + for (auto const &marker : outcome.result().DeleteMarkerSummarys()) { + client->DeleteObject( + DeleteObjectRequest(bucket, marker.Key(), marker.VersionId())); } - request.setMarker(outcome.result().NextMarker()); - IsTruncated = outcome.result().IsTruncated(); - } while (IsTruncated); - // Delete the bucket. - client->DeleteBucket(DeleteBucketRequest(bucket)); - std::cout << __FUNCTION__ << " done" << std::endl; -} + for (auto const &obj : outcome.result().ObjectVersionSummarys()) { + client->DeleteObject( + DeleteObjectRequest(bucket, obj.Key(), obj.VersionId())); + } + } else { + break; + } + request.setKeyMarker(outcome.result().NextKeyMarker()); + request.setVersionIdMarker(outcome.result().NextVersionIdMarker()); -void BucketSample::DeleteBucketsByPrefix() -{ - std::string prefix = "cpp-sdk-"; - ListBucketsRequest request; - request.setPrefix(prefix); - auto outcome = client->ListBuckets(request); - if (!outcome.isSuccess()) { - PrintError(__FUNCTION__, outcome.error()); - return; + IsTruncated = outcome.result().IsTruncated(); + } while (IsTruncated); + } + + // abort in progress multipart uploading + auto listOutcome = + client->ListMultipartUploads(ListMultipartUploadsRequest(bucket)); + if (listOutcome.isSuccess()) { + for (auto const &upload : listOutcome.result().MultipartUploadList()) { + client->AbortMultipartUpload( + AbortMultipartUploadRequest(bucket, upload.Key, upload.UploadId)); + } + } + + // List And Delete Object + ListObjectsRequest request(bucket); + bool IsTruncated = false; + do { + auto outcome = client->ListObjects(request); + if (outcome.isSuccess()) { + for (auto const &obj : outcome.result().ObjectSummarys()) { + auto dOutcome = + client->DeleteObject(DeleteObjectRequest(bucket, obj.Key())); + std::cout << __FUNCTION__ << "Delete Object:" << obj.Key() + << ", result:" << dOutcome.isSuccess() << std::endl; + } + } else { + PrintError(__FUNCTION__, outcome.error()); + break; } + request.setMarker(outcome.result().NextMarker()); + IsTruncated = outcome.result().IsTruncated(); + } while (IsTruncated); - for (auto const &bucket : outcome.result().Buckets()) - { - CleanAndDeleteBucket(bucket.Name()); - } + // Delete the bucket. + client->DeleteBucket(DeleteBucketRequest(bucket)); + std::cout << __FUNCTION__ << " done" << std::endl; +} - std::cout << __FUNCTION__ << " done, and total is " << outcome.result().Buckets().size() << std::endl; +void BucketSample::DeleteBucketsByPrefix() { + std::string prefix = "cpp-sdk-"; + ListBucketsRequest request; + request.setPrefix(prefix); + auto outcome = client->ListBuckets(request); + if (!outcome.isSuccess()) { + PrintError(__FUNCTION__, outcome.error()); + return; + } + + for (auto const &bucket : outcome.result().Buckets()) { + CleanAndDeleteBucket(bucket.Name()); + } + + std::cout << __FUNCTION__ << " done, and total is " + << outcome.result().Buckets().size() << std::endl; } -void BucketSample::DoesBucketExist() -{ - auto outcome = client->DoesBucketExist(bucket_); - std::cout << __FUNCTION__ << " success, Bucket exist ? " << outcome << std::endl; +void BucketSample::DoesBucketExist() { + auto outcome = client->DoesBucketExist(bucket_); + std::cout << __FUNCTION__ << " success, Bucket exist ? " << outcome + << std::endl; } \ No newline at end of file diff --git a/sample/src/bucket/BucketSample.h b/sample/src/bucket/BucketSample.h index 2eebb05..7e931a5 100644 --- a/sample/src/bucket/BucketSample.h +++ b/sample/src/bucket/BucketSample.h @@ -1,41 +1,44 @@ #include -class BucketSample -{ +class BucketSample { public: - BucketSample(const std::string &bucket); - ~BucketSample(); + BucketSample(const std::string &bucket); + ~BucketSample(); - void DoesBucketExist(); + void DoesBucketExist(); - void InvalidBucketName(); - void CreateAndDeleteBucket(); - void SetBucketAcl(); - void SetBucketLogging(); - void SetBucketWebsite(); - void SetBucketReferer(); - void SetBucketLifecycle(); - void SetBucketCors(); + void InvalidBucketName(); + void CreateAndDeleteBucket(); + void SetBucketAcl(); + void SetBucketLogging(); + void SetBucketWebsite(); + void SetBucketReferer(); + void SetBucketLifecycle(); + void SetBucketCors(); - void DeleteBucketLogging(); - void DeleteBucketWebsite(); - void DeleteBucketLifecycle(); - void DeleteBucketCors(); + void DeleteBucketLogging(); + void DeleteBucketWebsite(); + void DeleteBucketLifecycle(); + void DeleteBucketCors(); - void GetBucketAcl(); - void GetBucketLocation(); - void GetBucketLogging(); - void GetBucketWebsite(); - void GetBucketReferer(); - void GetBucketLifecycle(); - void GetBucketStat(); - void GetBucketCors(); - - void CleanAndDeleteBucket(const std::string &bucket); - void DeleteBucketsByPrefix(); + void GetBucketAcl(); + void GetBucketLocation(); + void GetBucketLogging(); + void GetBucketWebsite(); + void GetBucketReferer(); + void GetBucketLifecycle(); + void GetBucketStat(); + void GetBucketCors(); + void CleanAndDeleteBucket(const std::string &bucket); + void DeleteBucketsByPrefix(); +#ifdef USE_CPP20 + async_simple::coro::Lazy + test_coro_lazy(const AlibabaCloud::OSS::CreateBucketRequest &request); +#endif private: - void PrintError(const std::string &funcName, const AlibabaCloud::OSS::OssError &error); - AlibabaCloud::OSS::OssClient *client; - std::string bucket_; + void PrintError(const std::string &funcName, + const AlibabaCloud::OSS::OssError &error); + AlibabaCloud::OSS::OssClient *client; + std::string bucket_; }; diff --git a/sdk/include/alibabacloud/oss/Config.h b/sdk/include/alibabacloud/oss/Config.h index b4a6541..7931111 100644 --- a/sdk/include/alibabacloud/oss/Config.h +++ b/sdk/include/alibabacloud/oss/Config.h @@ -1,28 +1,28 @@ -/* - * Copyright 2009-2017 Alibaba Cloud All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -// version = (major << 16) + (minor << 8) + patch -#define ALIBABACLOUD_OSS_VERSION ((1 << 16) + (9 << 8) + 1) - -#define ALIBABACLOUD_OSS_VERSION_STR "1.9.1" - -// auto generated by cmake option -/* #undef OSS_DISABLE_BUCKET */ -/* #undef OSS_DISABLE_LIVECHANNEL */ -/* #undef OSS_DISABLE_RESUAMABLE */ -/* #undef OSS_DISABLE_ENCRYPTION */ +/* + * Copyright 2009-2017 Alibaba Cloud All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +// version = (major << 16) + (minor << 8) + patch +#define ALIBABACLOUD_OSS_VERSION ((1 << 16) + (9 << 8) + 1) + +#define ALIBABACLOUD_OSS_VERSION_STR "1.9.1" + +// auto generated by cmake option +/* #undef OSS_DISABLE_BUCKET */ +/* #undef OSS_DISABLE_LIVECHANNEL */ +/* #undef OSS_DISABLE_RESUAMABLE */ +/* #undef OSS_DISABLE_ENCRYPTION */ diff --git a/sdk/include/alibabacloud/oss/OssClient.h b/sdk/include/alibabacloud/oss/OssClient.h index 04a9725..b6bcfe7 100644 --- a/sdk/include/alibabacloud/oss/OssClient.h +++ b/sdk/include/alibabacloud/oss/OssClient.h @@ -1,288 +1,438 @@ /* -* Copyright 2009-2017 Alibaba Cloud All rights reserved. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2009-2017 Alibaba Cloud All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #pragma once #include -#include -#include #include +#include #include -#include +#include +#include #include +#include -namespace AlibabaCloud -{ -namespace OSS -{ - /*Global Init/Deinit*/ - void ALIBABACLOUD_OSS_EXPORT InitializeSdk(); - bool ALIBABACLOUD_OSS_EXPORT IsSdkInitialized(); - void ALIBABACLOUD_OSS_EXPORT ShutdownSdk(); - - /*Log*/ - void ALIBABACLOUD_OSS_EXPORT SetLogLevel(LogLevel level); - void ALIBABACLOUD_OSS_EXPORT SetLogCallback(LogCallback callback); +namespace AlibabaCloud { +namespace OSS { +/*Global Init/Deinit*/ +void ALIBABACLOUD_OSS_EXPORT InitializeSdk(); +bool ALIBABACLOUD_OSS_EXPORT IsSdkInitialized(); +void ALIBABACLOUD_OSS_EXPORT ShutdownSdk(); - /*Utils*/ - std::string ALIBABACLOUD_OSS_EXPORT ComputeContentMD5(const char *data, size_t size); - std::string ALIBABACLOUD_OSS_EXPORT ComputeContentMD5(std::istream& stream); - std::string ALIBABACLOUD_OSS_EXPORT ComputeContentETag(const char* data, size_t size); - std::string ALIBABACLOUD_OSS_EXPORT ComputeContentETag(std::istream& stream); - std::string ALIBABACLOUD_OSS_EXPORT UrlEncode(const std::string& src); - std::string ALIBABACLOUD_OSS_EXPORT UrlDecode(const std::string& src); - std::string ALIBABACLOUD_OSS_EXPORT Base64Encode(const std::string& src); - std::string ALIBABACLOUD_OSS_EXPORT Base64Encode(const char* src, int len); - std::string ALIBABACLOUD_OSS_EXPORT Base64EncodeUrlSafe(const std::string& src); - std::string ALIBABACLOUD_OSS_EXPORT Base64EncodeUrlSafe(const char* src, int len); - std::string ALIBABACLOUD_OSS_EXPORT ToGmtTime(std::time_t& t); - std::string ALIBABACLOUD_OSS_EXPORT ToUtcTime(std::time_t& t); - std::time_t ALIBABACLOUD_OSS_EXPORT UtcToUnixTime(const std::string& t); - uint64_t ALIBABACLOUD_OSS_EXPORT ComputeCRC64(uint64_t crc, void* buf, size_t len); - uint64_t ALIBABACLOUD_OSS_EXPORT CombineCRC64(uint64_t crc1, uint64_t crc2, uintmax_t len2); +/*Log*/ +void ALIBABACLOUD_OSS_EXPORT SetLogLevel(LogLevel level); +void ALIBABACLOUD_OSS_EXPORT SetLogCallback(LogCallback callback); - /*Aysnc APIs*/ - class OssClient; - using ListObjectAsyncHandler = std::function&)>; - using GetObjectAsyncHandler = std::function&)>; - using PutObjectAsyncHandler = std::function&)>; - using UploadPartAsyncHandler = std::function&)>; - using UploadPartCopyAsyncHandler = std::function&)>; +/*Utils*/ +std::string ALIBABACLOUD_OSS_EXPORT ComputeContentMD5(const char *data, + size_t size); +std::string ALIBABACLOUD_OSS_EXPORT ComputeContentMD5(std::istream &stream); +std::string ALIBABACLOUD_OSS_EXPORT ComputeContentETag(const char *data, + size_t size); +std::string ALIBABACLOUD_OSS_EXPORT ComputeContentETag(std::istream &stream); +std::string ALIBABACLOUD_OSS_EXPORT UrlEncode(const std::string &src); +std::string ALIBABACLOUD_OSS_EXPORT UrlDecode(const std::string &src); +std::string ALIBABACLOUD_OSS_EXPORT Base64Encode(const std::string &src); +std::string ALIBABACLOUD_OSS_EXPORT Base64Encode(const char *src, int len); +std::string ALIBABACLOUD_OSS_EXPORT Base64EncodeUrlSafe(const std::string &src); +std::string ALIBABACLOUD_OSS_EXPORT Base64EncodeUrlSafe(const char *src, + int len); +std::string ALIBABACLOUD_OSS_EXPORT ToGmtTime(std::time_t &t); +std::string ALIBABACLOUD_OSS_EXPORT ToUtcTime(std::time_t &t); +std::time_t ALIBABACLOUD_OSS_EXPORT UtcToUnixTime(const std::string &t); +uint64_t ALIBABACLOUD_OSS_EXPORT ComputeCRC64(uint64_t crc, void *buf, + size_t len); +uint64_t ALIBABACLOUD_OSS_EXPORT CombineCRC64(uint64_t crc1, uint64_t crc2, + uintmax_t len2); - /*Callable*/ - using ListObjectOutcomeCallable = std::future; - using GetObjectOutcomeCallable = std::future; - using PutObjectOutcomeCallable = std::future; - using UploadPartCopyOutcomeCallable = std::future; +/*Aysnc APIs*/ +class OssClient; +using ListObjectAsyncHandler = + std::function &)>; +using GetObjectAsyncHandler = + std::function &)>; +using PutObjectAsyncHandler = + std::function &)>; +using UploadPartAsyncHandler = + std::function &)>; +using UploadPartCopyAsyncHandler = std::function &)>; - class OssClientImpl; - class ALIBABACLOUD_OSS_EXPORT OssClient - { - public: +/*Callable*/ +using ListObjectOutcomeCallable = std::future; +using GetObjectOutcomeCallable = std::future; +using PutObjectOutcomeCallable = std::future; +using UploadPartCopyOutcomeCallable = std::future; - OssClient(const std::string& endpoint, const std::string& accessKeyId, const std::string& accessKeySecret, - const ClientConfiguration& configuration); - OssClient(const std::string& endpoint, const std::string& accessKeyId, const std::string& accessKeySecret, const std::string& securityToken, - const ClientConfiguration& configuration); - OssClient(const std::string& endpoint, const Credentials& credentials, const ClientConfiguration& configuration); - OssClient(const std::string& endpoint, const std::shared_ptr& credentialsProvider, const ClientConfiguration& configuration); - virtual ~OssClient(); +class OssClientImpl; +class ALIBABACLOUD_OSS_EXPORT OssClient { +public: + OssClient(const std::string &endpoint, const std::string &accessKeyId, + const std::string &accessKeySecret, + const ClientConfiguration &configuration); + OssClient(const std::string &endpoint, const std::string &accessKeyId, + const std::string &accessKeySecret, + const std::string &securityToken, + const ClientConfiguration &configuration); + OssClient(const std::string &endpoint, const Credentials &credentials, + const ClientConfiguration &configuration); + OssClient(const std::string &endpoint, + const std::shared_ptr &credentialsProvider, + const ClientConfiguration &configuration); + virtual ~OssClient(); #if !defined(OSS_DISABLE_BUCKET) - /*Service*/ - ListBucketsOutcome ListBuckets() const; - ListBucketsOutcome ListBuckets(const ListBucketsRequest& request) const; + /*Service*/ + ListBucketsOutcome ListBuckets() const; + ListBucketsOutcome ListBuckets(const ListBucketsRequest &request) const; - /*Bucket*/ - CreateBucketOutcome CreateBucket(const std::string& bucket, StorageClass storageClass = StorageClass::Standard) const; - CreateBucketOutcome CreateBucket(const std::string& bucket, StorageClass storageClass, CannedAccessControlList acl) const; - CreateBucketOutcome CreateBucket(const CreateBucketRequest& request) const; + /*Bucket*/ + CreateBucketOutcome + CreateBucket(const std::string &bucket, + StorageClass storageClass = StorageClass::Standard) const; + CreateBucketOutcome CreateBucket(const std::string &bucket, + StorageClass storageClass, + CannedAccessControlList acl) const; + CreateBucketOutcome CreateBucket(const CreateBucketRequest &request) const; +#ifdef USE_CPP20 + async_simple::coro::Lazy + CreateBucketAsync(const CreateBucketRequest &request) const; +#endif - ListBucketInventoryConfigurationsOutcome ListBucketInventoryConfigurations(const ListBucketInventoryConfigurationsRequest& request) const; + ListBucketInventoryConfigurationsOutcome ListBucketInventoryConfigurations( + const ListBucketInventoryConfigurationsRequest &request) const; - VoidOutcome SetBucketAcl(const std::string& bucket, CannedAccessControlList acl) const; - VoidOutcome SetBucketAcl(const SetBucketAclRequest& request) const; - VoidOutcome SetBucketLogging(const std::string& bucket, const std::string& targetBucket, const std::string& targetPrefix) const; - VoidOutcome SetBucketLogging(const SetBucketLoggingRequest& request) const; - VoidOutcome SetBucketWebsite(const std::string& bucket, const std::string& indexDocument) const; - VoidOutcome SetBucketWebsite(const std::string& bucket, const std::string& indexDocument, const std::string& errorDocument) const; - VoidOutcome SetBucketWebsite(const SetBucketWebsiteRequest& request) const; - VoidOutcome SetBucketReferer(const std::string& bucket, const RefererList& refererList, bool allowEmptyReferer) const; - VoidOutcome SetBucketReferer(const SetBucketRefererRequest& request) const; - VoidOutcome SetBucketLifecycle(const SetBucketLifecycleRequest& request) const; - VoidOutcome SetBucketCors(const std::string& bucket, const CORSRuleList& rules) const; - VoidOutcome SetBucketCors(const SetBucketCorsRequest& request) const; - VoidOutcome SetBucketStorageCapacity(const std::string& bucket, int64_t storageCapacity) const; - VoidOutcome SetBucketStorageCapacity(const SetBucketStorageCapacityRequest& request) const; - VoidOutcome SetBucketPolicy(const SetBucketPolicyRequest& request) const; - VoidOutcome SetBucketRequestPayment(const SetBucketRequestPaymentRequest& request) const; - VoidOutcome SetBucketEncryption(const SetBucketEncryptionRequest& request) const; - VoidOutcome SetBucketTagging(const SetBucketTaggingRequest& request) const; - VoidOutcome SetBucketQosInfo(const SetBucketQosInfoRequest& request) const; - VoidOutcome SetBucketVersioning(const SetBucketVersioningRequest& request) const; - VoidOutcome SetBucketInventoryConfiguration(const SetBucketInventoryConfigurationRequest& request) const; + VoidOutcome SetBucketAcl(const std::string &bucket, + CannedAccessControlList acl) const; + VoidOutcome SetBucketAcl(const SetBucketAclRequest &request) const; + VoidOutcome SetBucketLogging(const std::string &bucket, + const std::string &targetBucket, + const std::string &targetPrefix) const; + VoidOutcome SetBucketLogging(const SetBucketLoggingRequest &request) const; + VoidOutcome SetBucketWebsite(const std::string &bucket, + const std::string &indexDocument) const; + VoidOutcome SetBucketWebsite(const std::string &bucket, + const std::string &indexDocument, + const std::string &errorDocument) const; + VoidOutcome SetBucketWebsite(const SetBucketWebsiteRequest &request) const; + VoidOutcome SetBucketReferer(const std::string &bucket, + const RefererList &refererList, + bool allowEmptyReferer) const; + VoidOutcome SetBucketReferer(const SetBucketRefererRequest &request) const; + VoidOutcome + SetBucketLifecycle(const SetBucketLifecycleRequest &request) const; + VoidOutcome SetBucketCors(const std::string &bucket, + const CORSRuleList &rules) const; + VoidOutcome SetBucketCors(const SetBucketCorsRequest &request) const; + VoidOutcome SetBucketStorageCapacity(const std::string &bucket, + int64_t storageCapacity) const; + VoidOutcome SetBucketStorageCapacity( + const SetBucketStorageCapacityRequest &request) const; + VoidOutcome SetBucketPolicy(const SetBucketPolicyRequest &request) const; + VoidOutcome + SetBucketRequestPayment(const SetBucketRequestPaymentRequest &request) const; + VoidOutcome + SetBucketEncryption(const SetBucketEncryptionRequest &request) const; + VoidOutcome SetBucketTagging(const SetBucketTaggingRequest &request) const; + VoidOutcome SetBucketQosInfo(const SetBucketQosInfoRequest &request) const; + VoidOutcome + SetBucketVersioning(const SetBucketVersioningRequest &request) const; + VoidOutcome SetBucketInventoryConfiguration( + const SetBucketInventoryConfigurationRequest &request) const; - VoidOutcome DeleteBucket(const std::string& bucket) const; - VoidOutcome DeleteBucket(const DeleteBucketRequest& request) const; - VoidOutcome DeleteBucketLogging(const std::string& bucket) const; - VoidOutcome DeleteBucketLogging(const DeleteBucketLoggingRequest& request) const; - VoidOutcome DeleteBucketPolicy(const DeleteBucketPolicyRequest& request) const; - VoidOutcome DeleteBucketWebsite(const std::string& bucket) const; - VoidOutcome DeleteBucketWebsite(const DeleteBucketWebsiteRequest& request) const; - VoidOutcome DeleteBucketLifecycle(const std::string& bucket) const; - VoidOutcome DeleteBucketLifecycle(const DeleteBucketLifecycleRequest& request) const; - VoidOutcome DeleteBucketCors(const std::string& bucket) const; - VoidOutcome DeleteBucketCors(const DeleteBucketCorsRequest& request) const; - VoidOutcome DeleteBucketEncryption(const DeleteBucketEncryptionRequest& request) const; - VoidOutcome DeleteBucketTagging(const DeleteBucketTaggingRequest& request) const; - VoidOutcome DeleteBucketQosInfo(const DeleteBucketQosInfoRequest& request) const; - VoidOutcome DeleteBucketInventoryConfiguration(const DeleteBucketInventoryConfigurationRequest& request) const; + VoidOutcome DeleteBucket(const std::string &bucket) const; + VoidOutcome DeleteBucket(const DeleteBucketRequest &request) const; + VoidOutcome DeleteBucketLogging(const std::string &bucket) const; + VoidOutcome + DeleteBucketLogging(const DeleteBucketLoggingRequest &request) const; + VoidOutcome + DeleteBucketPolicy(const DeleteBucketPolicyRequest &request) const; + VoidOutcome DeleteBucketWebsite(const std::string &bucket) const; + VoidOutcome + DeleteBucketWebsite(const DeleteBucketWebsiteRequest &request) const; + VoidOutcome DeleteBucketLifecycle(const std::string &bucket) const; + VoidOutcome + DeleteBucketLifecycle(const DeleteBucketLifecycleRequest &request) const; + VoidOutcome DeleteBucketCors(const std::string &bucket) const; + VoidOutcome DeleteBucketCors(const DeleteBucketCorsRequest &request) const; + VoidOutcome + DeleteBucketEncryption(const DeleteBucketEncryptionRequest &request) const; + VoidOutcome + DeleteBucketTagging(const DeleteBucketTaggingRequest &request) const; + VoidOutcome + DeleteBucketQosInfo(const DeleteBucketQosInfoRequest &request) const; + VoidOutcome DeleteBucketInventoryConfiguration( + const DeleteBucketInventoryConfigurationRequest &request) const; - GetBucketAclOutcome GetBucketAcl(const std::string& bucket) const; - GetBucketAclOutcome GetBucketAcl(const GetBucketAclRequest& request) const; - GetBucketLocationOutcome GetBucketLocation(const std::string& bucket) const; - GetBucketLocationOutcome GetBucketLocation(const GetBucketLocationRequest& request) const; - GetBucketInfoOutcome GetBucketInfo(const std::string& bucket) const; - GetBucketInfoOutcome GetBucketInfo(const GetBucketInfoRequest& request) const; - GetBucketLoggingOutcome GetBucketLogging(const std::string& bucket) const; - GetBucketLoggingOutcome GetBucketLogging(const GetBucketLoggingRequest& request) const; - GetBucketWebsiteOutcome GetBucketWebsite(const std::string& bucket) const; - GetBucketWebsiteOutcome GetBucketWebsite(const GetBucketWebsiteRequest& request) const; - GetBucketRefererOutcome GetBucketReferer(const std::string& bucket) const; - GetBucketRefererOutcome GetBucketReferer(const GetBucketRefererRequest& request) const; - GetBucketLifecycleOutcome GetBucketLifecycle(const std::string& bucket) const; - GetBucketLifecycleOutcome GetBucketLifecycle(const GetBucketLifecycleRequest& request) const; - GetBucketStatOutcome GetBucketStat(const std::string& bucket) const; - GetBucketStatOutcome GetBucketStat(const GetBucketStatRequest& request) const; - GetBucketCorsOutcome GetBucketCors(const std::string& bucket) const; - GetBucketCorsOutcome GetBucketCors(const GetBucketCorsRequest& request) const; - GetBucketStorageCapacityOutcome GetBucketStorageCapacity(const std::string& bucket) const; - GetBucketStorageCapacityOutcome GetBucketStorageCapacity(const GetBucketStorageCapacityRequest& request) const; - GetBucketPolicyOutcome GetBucketPolicy(const GetBucketPolicyRequest& request) const; - GetBucketPaymentOutcome GetBucketRequestPayment(const GetBucketRequestPaymentRequest& request) const; - GetBucketEncryptionOutcome GetBucketEncryption(const GetBucketEncryptionRequest& request) const; - GetBucketTaggingOutcome GetBucketTagging(const GetBucketTaggingRequest& request) const; - GetBucketQosInfoOutcome GetBucketQosInfo(const GetBucketQosInfoRequest& request) const; - GetUserQosInfoOutcome GetUserQosInfo(const GetUserQosInfoRequest& request) const; - GetBucketVersioningOutcome GetBucketVersioning(const GetBucketVersioningRequest& request) const; - GetBucketInventoryConfigurationOutcome GetBucketInventoryConfiguration(const GetBucketInventoryConfigurationRequest& request) const; - InitiateBucketWormOutcome InitiateBucketWorm(const InitiateBucketWormRequest& request) const; - VoidOutcome AbortBucketWorm(const AbortBucketWormRequest& request) const; - VoidOutcome CompleteBucketWorm(const CompleteBucketWormRequest& request) const; - VoidOutcome ExtendBucketWormWorm(const ExtendBucketWormRequest& request) const; - GetBucketWormOutcome GetBucketWorm(const GetBucketWormRequest& request) const; + GetBucketAclOutcome GetBucketAcl(const std::string &bucket) const; + GetBucketAclOutcome GetBucketAcl(const GetBucketAclRequest &request) const; + GetBucketLocationOutcome GetBucketLocation(const std::string &bucket) const; + GetBucketLocationOutcome + GetBucketLocation(const GetBucketLocationRequest &request) const; + GetBucketInfoOutcome GetBucketInfo(const std::string &bucket) const; + GetBucketInfoOutcome GetBucketInfo(const GetBucketInfoRequest &request) const; + GetBucketLoggingOutcome GetBucketLogging(const std::string &bucket) const; + GetBucketLoggingOutcome + GetBucketLogging(const GetBucketLoggingRequest &request) const; + GetBucketWebsiteOutcome GetBucketWebsite(const std::string &bucket) const; + GetBucketWebsiteOutcome + GetBucketWebsite(const GetBucketWebsiteRequest &request) const; + GetBucketRefererOutcome GetBucketReferer(const std::string &bucket) const; + GetBucketRefererOutcome + GetBucketReferer(const GetBucketRefererRequest &request) const; + GetBucketLifecycleOutcome GetBucketLifecycle(const std::string &bucket) const; + GetBucketLifecycleOutcome + GetBucketLifecycle(const GetBucketLifecycleRequest &request) const; + GetBucketStatOutcome GetBucketStat(const std::string &bucket) const; + GetBucketStatOutcome GetBucketStat(const GetBucketStatRequest &request) const; + GetBucketCorsOutcome GetBucketCors(const std::string &bucket) const; + GetBucketCorsOutcome GetBucketCors(const GetBucketCorsRequest &request) const; + GetBucketStorageCapacityOutcome + GetBucketStorageCapacity(const std::string &bucket) const; + GetBucketStorageCapacityOutcome GetBucketStorageCapacity( + const GetBucketStorageCapacityRequest &request) const; + GetBucketPolicyOutcome + GetBucketPolicy(const GetBucketPolicyRequest &request) const; + GetBucketPaymentOutcome + GetBucketRequestPayment(const GetBucketRequestPaymentRequest &request) const; + GetBucketEncryptionOutcome + GetBucketEncryption(const GetBucketEncryptionRequest &request) const; + GetBucketTaggingOutcome + GetBucketTagging(const GetBucketTaggingRequest &request) const; + GetBucketQosInfoOutcome + GetBucketQosInfo(const GetBucketQosInfoRequest &request) const; + GetUserQosInfoOutcome + GetUserQosInfo(const GetUserQosInfoRequest &request) const; + GetBucketVersioningOutcome + GetBucketVersioning(const GetBucketVersioningRequest &request) const; + GetBucketInventoryConfigurationOutcome GetBucketInventoryConfiguration( + const GetBucketInventoryConfigurationRequest &request) const; + InitiateBucketWormOutcome + InitiateBucketWorm(const InitiateBucketWormRequest &request) const; + VoidOutcome AbortBucketWorm(const AbortBucketWormRequest &request) const; + VoidOutcome + CompleteBucketWorm(const CompleteBucketWormRequest &request) const; + VoidOutcome + ExtendBucketWormWorm(const ExtendBucketWormRequest &request) const; + GetBucketWormOutcome GetBucketWorm(const GetBucketWormRequest &request) const; #endif - /*Object*/ - ListObjectOutcome ListObjects(const std::string& bucket) const; - ListObjectOutcome ListObjects(const std::string& bucket, const std::string& prefix) const; - ListObjectOutcome ListObjects(const ListObjectsRequest& request) const; - ListObjectsV2Outcome ListObjectsV2(const ListObjectsV2Request& request) const; - ListObjectVersionsOutcome ListObjectVersions(const std::string& bucket) const; - ListObjectVersionsOutcome ListObjectVersions(const std::string& bucket, const std::string& prefix) const; - ListObjectVersionsOutcome ListObjectVersions(const ListObjectVersionsRequest& request) const; + /*Object*/ + ListObjectOutcome ListObjects(const std::string &bucket) const; + ListObjectOutcome ListObjects(const std::string &bucket, + const std::string &prefix) const; + ListObjectOutcome ListObjects(const ListObjectsRequest &request) const; + ListObjectsV2Outcome ListObjectsV2(const ListObjectsV2Request &request) const; + ListObjectVersionsOutcome ListObjectVersions(const std::string &bucket) const; + ListObjectVersionsOutcome ListObjectVersions(const std::string &bucket, + const std::string &prefix) const; + ListObjectVersionsOutcome + ListObjectVersions(const ListObjectVersionsRequest &request) const; - GetObjectOutcome GetObject(const std::string& bucket, const std::string& key) const; - GetObjectOutcome GetObject(const std::string& bucket, const std::string& key, const std::shared_ptr& content) const; - GetObjectOutcome GetObject(const std::string& bucket, const std::string& key, const std::string& fileToSave) const; - GetObjectOutcome GetObject(const GetObjectRequest& request) const; - PutObjectOutcome PutObject(const std::string& bucket, const std::string& key, const std::shared_ptr& content) const; - PutObjectOutcome PutObject(const std::string& bucket, const std::string& key, const std::string& fileToUpload) const; - PutObjectOutcome PutObject(const std::string& bucket, const std::string& key, const std::shared_ptr& content, const ObjectMetaData& meta) const; - PutObjectOutcome PutObject(const std::string& bucket, const std::string& key, const std::string& fileToUpload, const ObjectMetaData& meta) const; - PutObjectOutcome PutObject(const PutObjectRequest& request) const; - DeleteObjectOutcome DeleteObject(const std::string& bucket, const std::string& key) const; - DeleteObjectOutcome DeleteObject(const DeleteObjectRequest& request) const; - DeleteObjecstOutcome DeleteObjects(const std::string bucket, const DeletedKeyList &keyList) const; - DeleteObjecstOutcome DeleteObjects(const DeleteObjectsRequest& request) const; - DeleteObjecVersionstOutcome DeleteObjectVersions(const std::string bucket, const ObjectIdentifierList &objectList) const; - DeleteObjecVersionstOutcome DeleteObjectVersions(const DeleteObjectVersionsRequest& request) const; - ObjectMetaDataOutcome HeadObject(const std::string& bucket, const std::string& key) const; - ObjectMetaDataOutcome HeadObject(const HeadObjectRequest& request) const; - ObjectMetaDataOutcome GetObjectMeta(const std::string& bucket, const std::string& key) const; - ObjectMetaDataOutcome GetObjectMeta(const GetObjectMetaRequest& request) const; - AppendObjectOutcome AppendObject(const AppendObjectRequest& request) const; - CopyObjectOutcome CopyObject(const CopyObjectRequest& request) const; - RestoreObjectOutcome RestoreObject(const std::string& bucket, const std::string& key) const; - RestoreObjectOutcome RestoreObject(const RestoreObjectRequest& request) const; - SetObjectAclOutcome SetObjectAcl(const SetObjectAclRequest& request) const; - GetObjectAclOutcome GetObjectAcl(const GetObjectAclRequest& request) const; - CreateSymlinkOutcome CreateSymlink(const CreateSymlinkRequest& request) const; - GetSymlinkOutcome GetSymlink(const GetSymlinkRequest& request) const; - GetObjectOutcome ProcessObject(const ProcessObjectRequest& request) const; + GetObjectOutcome GetObject(const std::string &bucket, + const std::string &key) const; + GetObjectOutcome + GetObject(const std::string &bucket, const std::string &key, + const std::shared_ptr &content) const; + GetObjectOutcome GetObject(const std::string &bucket, const std::string &key, + const std::string &fileToSave) const; + GetObjectOutcome GetObject(const GetObjectRequest &request) const; + PutObjectOutcome + PutObject(const std::string &bucket, const std::string &key, + const std::shared_ptr &content) const; + PutObjectOutcome PutObject(const std::string &bucket, const std::string &key, + const std::string &fileToUpload) const; + PutObjectOutcome PutObject(const std::string &bucket, const std::string &key, + const std::shared_ptr &content, + const ObjectMetaData &meta) const; + PutObjectOutcome PutObject(const std::string &bucket, const std::string &key, + const std::string &fileToUpload, + const ObjectMetaData &meta) const; + PutObjectOutcome PutObject(const PutObjectRequest &request) const; + DeleteObjectOutcome DeleteObject(const std::string &bucket, + const std::string &key) const; + DeleteObjectOutcome DeleteObject(const DeleteObjectRequest &request) const; + DeleteObjecstOutcome DeleteObjects(const std::string bucket, + const DeletedKeyList &keyList) const; + DeleteObjecstOutcome DeleteObjects(const DeleteObjectsRequest &request) const; + DeleteObjecVersionstOutcome + DeleteObjectVersions(const std::string bucket, + const ObjectIdentifierList &objectList) const; + DeleteObjecVersionstOutcome + DeleteObjectVersions(const DeleteObjectVersionsRequest &request) const; + ObjectMetaDataOutcome HeadObject(const std::string &bucket, + const std::string &key) const; + ObjectMetaDataOutcome HeadObject(const HeadObjectRequest &request) const; + ObjectMetaDataOutcome GetObjectMeta(const std::string &bucket, + const std::string &key) const; + ObjectMetaDataOutcome + GetObjectMeta(const GetObjectMetaRequest &request) const; + AppendObjectOutcome AppendObject(const AppendObjectRequest &request) const; + CopyObjectOutcome CopyObject(const CopyObjectRequest &request) const; + RestoreObjectOutcome RestoreObject(const std::string &bucket, + const std::string &key) const; + RestoreObjectOutcome RestoreObject(const RestoreObjectRequest &request) const; + SetObjectAclOutcome SetObjectAcl(const SetObjectAclRequest &request) const; + GetObjectAclOutcome GetObjectAcl(const GetObjectAclRequest &request) const; + CreateSymlinkOutcome CreateSymlink(const CreateSymlinkRequest &request) const; + GetSymlinkOutcome GetSymlink(const GetSymlinkRequest &request) const; + GetObjectOutcome ProcessObject(const ProcessObjectRequest &request) const; - GetObjectOutcome SelectObject(const SelectObjectRequest& request) const; - CreateSelectObjectMetaOutcome CreateSelectObjectMeta(const CreateSelectObjectMetaRequest& request) const; + GetObjectOutcome SelectObject(const SelectObjectRequest &request) const; + CreateSelectObjectMetaOutcome + CreateSelectObjectMeta(const CreateSelectObjectMetaRequest &request) const; - SetObjectTaggingOutcome SetObjectTagging(const SetObjectTaggingRequest& request) const; - DeleteObjectTaggingOutcome DeleteObjectTagging(const DeleteObjectTaggingRequest& request) const; - GetObjectTaggingOutcome GetObjectTagging(const GetObjectTaggingRequest& request) const; + SetObjectTaggingOutcome + SetObjectTagging(const SetObjectTaggingRequest &request) const; + DeleteObjectTaggingOutcome + DeleteObjectTagging(const DeleteObjectTaggingRequest &request) const; + GetObjectTaggingOutcome + GetObjectTagging(const GetObjectTaggingRequest &request) const; - /*MultipartUpload*/ - InitiateMultipartUploadOutcome InitiateMultipartUpload(const InitiateMultipartUploadRequest& request) const; - PutObjectOutcome UploadPart(const UploadPartRequest& request) const; - UploadPartCopyOutcome UploadPartCopy(const UploadPartCopyRequest& request) const; - CompleteMultipartUploadOutcome CompleteMultipartUpload(const CompleteMultipartUploadRequest& request) const; - VoidOutcome AbortMultipartUpload(const AbortMultipartUploadRequest& request) const; - ListMultipartUploadsOutcome ListMultipartUploads(const ListMultipartUploadsRequest& request) const; - ListPartsOutcome ListParts(const ListPartsRequest& request) const; + /*MultipartUpload*/ + InitiateMultipartUploadOutcome + InitiateMultipartUpload(const InitiateMultipartUploadRequest &request) const; + PutObjectOutcome UploadPart(const UploadPartRequest &request) const; + UploadPartCopyOutcome + UploadPartCopy(const UploadPartCopyRequest &request) const; + CompleteMultipartUploadOutcome + CompleteMultipartUpload(const CompleteMultipartUploadRequest &request) const; + VoidOutcome + AbortMultipartUpload(const AbortMultipartUploadRequest &request) const; + ListMultipartUploadsOutcome + ListMultipartUploads(const ListMultipartUploadsRequest &request) const; + ListPartsOutcome ListParts(const ListPartsRequest &request) const; - /*Generate URL*/ - StringOutcome GeneratePresignedUrl(const GeneratePresignedUrlRequest& request) const; - StringOutcome GeneratePresignedUrl(const std::string& bucket, const std::string& key) const; - StringOutcome GeneratePresignedUrl(const std::string& bucket, const std::string& key, int64_t expires) const; - StringOutcome GeneratePresignedUrl(const std::string& bucket, const std::string& key, int64_t expires, Http::Method method) const; - GetObjectOutcome GetObjectByUrl(const GetObjectByUrlRequest& request) const; - GetObjectOutcome GetObjectByUrl(const std::string& url) const; - GetObjectOutcome GetObjectByUrl(const std::string& url, const std::string& file) const; - PutObjectOutcome PutObjectByUrl(const PutObjectByUrlRequest& request) const; - PutObjectOutcome PutObjectByUrl(const std::string& url, const std::string& file) const; - PutObjectOutcome PutObjectByUrl(const std::string& url, const std::string& file, const ObjectMetaData& metaData) const; - PutObjectOutcome PutObjectByUrl(const std::string& url, const std::shared_ptr& content) const; - PutObjectOutcome PutObjectByUrl(const std::string& url, const std::shared_ptr& content, const ObjectMetaData& metaData) const; + /*Generate URL*/ + StringOutcome + GeneratePresignedUrl(const GeneratePresignedUrlRequest &request) const; + StringOutcome GeneratePresignedUrl(const std::string &bucket, + const std::string &key) const; + StringOutcome GeneratePresignedUrl(const std::string &bucket, + const std::string &key, + int64_t expires) const; + StringOutcome GeneratePresignedUrl(const std::string &bucket, + const std::string &key, int64_t expires, + Http::Method method) const; + GetObjectOutcome GetObjectByUrl(const GetObjectByUrlRequest &request) const; + GetObjectOutcome GetObjectByUrl(const std::string &url) const; + GetObjectOutcome GetObjectByUrl(const std::string &url, + const std::string &file) const; + PutObjectOutcome PutObjectByUrl(const PutObjectByUrlRequest &request) const; + PutObjectOutcome PutObjectByUrl(const std::string &url, + const std::string &file) const; + PutObjectOutcome PutObjectByUrl(const std::string &url, + const std::string &file, + const ObjectMetaData &metaData) const; + PutObjectOutcome + PutObjectByUrl(const std::string &url, + const std::shared_ptr &content) const; + PutObjectOutcome PutObjectByUrl(const std::string &url, + const std::shared_ptr &content, + const ObjectMetaData &metaData) const; - /*Generate Post Policy*/ + /*Generate Post Policy*/ - /*Resumable Operation*/ + /*Resumable Operation*/ #if !defined(OSS_DISABLE_RESUAMABLE) - PutObjectOutcome ResumableUploadObject(const UploadObjectRequest& request) const; - CopyObjectOutcome ResumableCopyObject(const MultiCopyObjectRequest& request) const; - GetObjectOutcome ResumableDownloadObject(const DownloadObjectRequest& request) const; + PutObjectOutcome + ResumableUploadObject(const UploadObjectRequest &request) const; + CopyObjectOutcome + ResumableCopyObject(const MultiCopyObjectRequest &request) const; + GetObjectOutcome + ResumableDownloadObject(const DownloadObjectRequest &request) const; #endif #if !defined(OSS_DISABLE_LIVECHANNEL) - /*Live Channel*/ - VoidOutcome PutLiveChannelStatus(const PutLiveChannelStatusRequest& request) const; - PutLiveChannelOutcome PutLiveChannel(const PutLiveChannelRequest& request) const; - VoidOutcome PostVodPlaylist(const PostVodPlaylistRequest& request) const; - GetVodPlaylistOutcome GetVodPlaylist(const GetVodPlaylistRequest& request) const; - GetLiveChannelStatOutcome GetLiveChannelStat(const GetLiveChannelStatRequest& request) const; - GetLiveChannelInfoOutcome GetLiveChannelInfo(const GetLiveChannelInfoRequest& request) const; - GetLiveChannelHistoryOutcome GetLiveChannelHistory(const GetLiveChannelHistoryRequest& request) const; - ListLiveChannelOutcome ListLiveChannel(const ListLiveChannelRequest& request) const; - VoidOutcome DeleteLiveChannel(const DeleteLiveChannelRequest& request) const; - StringOutcome GenerateRTMPSignedUrl(const GenerateRTMPSignedUrlRequest& request) const; + /*Live Channel*/ + VoidOutcome + PutLiveChannelStatus(const PutLiveChannelStatusRequest &request) const; + PutLiveChannelOutcome + PutLiveChannel(const PutLiveChannelRequest &request) const; + VoidOutcome PostVodPlaylist(const PostVodPlaylistRequest &request) const; + GetVodPlaylistOutcome + GetVodPlaylist(const GetVodPlaylistRequest &request) const; + GetLiveChannelStatOutcome + GetLiveChannelStat(const GetLiveChannelStatRequest &request) const; + GetLiveChannelInfoOutcome + GetLiveChannelInfo(const GetLiveChannelInfoRequest &request) const; + GetLiveChannelHistoryOutcome + GetLiveChannelHistory(const GetLiveChannelHistoryRequest &request) const; + ListLiveChannelOutcome + ListLiveChannel(const ListLiveChannelRequest &request) const; + VoidOutcome DeleteLiveChannel(const DeleteLiveChannelRequest &request) const; + StringOutcome + GenerateRTMPSignedUrl(const GenerateRTMPSignedUrlRequest &request) const; #endif - /*Aysnc APIs*/ - void ListObjectsAsync(const ListObjectsRequest& request, const ListObjectAsyncHandler& handler, const std::shared_ptr& context = nullptr) const; - void GetObjectAsync(const GetObjectRequest& request, const GetObjectAsyncHandler& handler, const std::shared_ptr& context = nullptr) const; - void PutObjectAsync(const PutObjectRequest& request, const PutObjectAsyncHandler& handler, const std::shared_ptr& context = nullptr) const; - void UploadPartAsync(const UploadPartRequest& request, const UploadPartAsyncHandler& handler, const std::shared_ptr& context = nullptr) const; - void UploadPartCopyAsync(const UploadPartCopyRequest& request, const UploadPartCopyAsyncHandler& handler, const std::shared_ptr& context = nullptr) const; + /*Aysnc APIs*/ + void ListObjectsAsync( + const ListObjectsRequest &request, const ListObjectAsyncHandler &handler, + const std::shared_ptr &context = nullptr) const; + void GetObjectAsync( + const GetObjectRequest &request, const GetObjectAsyncHandler &handler, + const std::shared_ptr &context = nullptr) const; + void PutObjectAsync( + const PutObjectRequest &request, const PutObjectAsyncHandler &handler, + const std::shared_ptr &context = nullptr) const; + void UploadPartAsync( + const UploadPartRequest &request, const UploadPartAsyncHandler &handler, + const std::shared_ptr &context = nullptr) const; + void UploadPartCopyAsync( + const UploadPartCopyRequest &request, + const UploadPartCopyAsyncHandler &handler, + const std::shared_ptr &context = nullptr) const; - /*Callable APIs*/ - ListObjectOutcomeCallable ListObjectsCallable(const ListObjectsRequest& request) const; - GetObjectOutcomeCallable GetObjectCallable(const GetObjectRequest& request) const; - PutObjectOutcomeCallable PutObjectCallable(const PutObjectRequest& request) const; - PutObjectOutcomeCallable UploadPartCallable(const UploadPartRequest& request) const; - UploadPartCopyOutcomeCallable UploadPartCopyCallable(const UploadPartCopyRequest& request) const; + /*Callable APIs*/ + ListObjectOutcomeCallable + ListObjectsCallable(const ListObjectsRequest &request) const; + GetObjectOutcomeCallable + GetObjectCallable(const GetObjectRequest &request) const; + PutObjectOutcomeCallable + PutObjectCallable(const PutObjectRequest &request) const; + PutObjectOutcomeCallable + UploadPartCallable(const UploadPartRequest &request) const; + UploadPartCopyOutcomeCallable + UploadPartCopyCallable(const UploadPartCopyRequest &request) const; - /*Extended APIs*/ + /*Extended APIs*/ #if !defined(OSS_DISABLE_BUCKET) - bool DoesBucketExist(const std::string& bucket) const; + bool DoesBucketExist(const std::string &bucket) const; #endif - bool DoesObjectExist(const std::string& bucket, const std::string& key) const; - CopyObjectOutcome ModifyObjectMeta(const std::string& bucket, const std::string& key, const ObjectMetaData& meta); + bool DoesObjectExist(const std::string &bucket, const std::string &key) const; + CopyObjectOutcome ModifyObjectMeta(const std::string &bucket, + const std::string &key, + const ObjectMetaData &meta); + + /*Requests control*/ + void DisableRequest(); + void EnableRequest(); - /*Requests control*/ - void DisableRequest(); - void EnableRequest(); - protected: - std::shared_ptr client_; - }; -} -} +protected: + std::shared_ptr client_; +}; +} // namespace OSS +} // namespace AlibabaCloud diff --git a/sdk/include/alibabacloud/oss/client/ClientConfiguration.h b/sdk/include/alibabacloud/oss/client/ClientConfiguration.h index 613b412..dfae96c 100644 --- a/sdk/include/alibabacloud/oss/client/ClientConfiguration.h +++ b/sdk/include/alibabacloud/oss/client/ClientConfiguration.h @@ -1,12 +1,12 @@ /* * Copyright 2009-2017 Alibaba Cloud All rights reserved. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,116 +15,119 @@ */ #pragma once -#include -#include #include #include #include +#include +#include + +namespace AlibabaCloud { +namespace OSS { +class RetryStrategy; +class RateLimiter; +class ALIBABACLOUD_OSS_EXPORT ClientConfiguration { +public: + ClientConfiguration(); + ~ClientConfiguration() = default; + +public: + /** + * User Agent string user for http calls. + */ + std::string userAgent; + /** + * Http scheme to use. E.g. Http or Https. + */ + Http::Scheme scheme; + /** + * Max concurrent tcp connections for a single http client to use. + */ + unsigned maxConnections; + /** + * Socket read timeouts. Default 3000 ms. + */ + long requestTimeoutMs; + /** + * Socket connect timeout. + */ + long connectTimeoutMs; + /** + * Strategy to use in case of failed requests. + */ + std::shared_ptr retryStrategy; + /** + * The proxy scheme. Default HTTP + */ + Http::Scheme proxyScheme; + /** + * The proxy host. + */ + std::string proxyHost; + /** + * The proxy port. + */ + unsigned int proxyPort; + /** + * The proxy username. + */ + std::string proxyUserName; + /** + * The proxy password + */ + std::string proxyPassword; + /** + * set false to bypass SSL check. + */ + bool verifySSL; + /** + * your Certificate Authority path. + */ + std::string caPath; + /** + * your certificate file. + */ + std::string caFile; + /** + * enable or disable cname, default is false. + */ + bool isCname; + /** + * enable or disable crc64 check. + */ + bool enableCrc64; + /** + * enable or disable auto correct http request date. + */ + bool enableDateSkewAdjustment; + +#ifdef USE_CPP20 + bool useCoro; +#endif -namespace AlibabaCloud -{ -namespace OSS -{ - class RetryStrategy; - class RateLimiter; - class ALIBABACLOUD_OSS_EXPORT ClientConfiguration - { - public: - ClientConfiguration(); - ~ClientConfiguration() = default; - public: - /** - * User Agent string user for http calls. - */ - std::string userAgent; - /** - * Http scheme to use. E.g. Http or Https. - */ - Http::Scheme scheme; - /** - * Max concurrent tcp connections for a single http client to use. - */ - unsigned maxConnections; - /** - * Socket read timeouts. Default 3000 ms. - */ - long requestTimeoutMs; - /** - * Socket connect timeout. - */ - long connectTimeoutMs; - /** - * Strategy to use in case of failed requests. - */ - std::shared_ptr retryStrategy; - /** - * The proxy scheme. Default HTTP - */ - Http::Scheme proxyScheme; - /** - * The proxy host. - */ - std::string proxyHost; - /** - * The proxy port. - */ - unsigned int proxyPort; - /** - * The proxy username. - */ - std::string proxyUserName; - /** - * The proxy password - */ - std::string proxyPassword; - /** - * set false to bypass SSL check. - */ - bool verifySSL; - /** - * your Certificate Authority path. - */ - std::string caPath; - /** - * your certificate file. - */ - std::string caFile; - /** - * enable or disable cname, default is false. - */ - bool isCname; - /** - * enable or disable crc64 check. - */ - bool enableCrc64; - /** - * enable or disable auto correct http request date. - */ - bool enableDateSkewAdjustment; - /** - * Rate limit data upload speed. - */ - std::shared_ptr sendRateLimiter; - /** - * Rate limit data download speed. - */ - std::shared_ptr recvRateLimiter; - /** - * The interface for outgoing traffic. E.g. eth0 in linux - */ - std::string networkInterface; - /** - * Your executor's implement - */ - std::shared_ptr executor; - /** - * Your http client' implement - */ - std::shared_ptr httpClient; - /** - * enable or disable path style, default is false. - */ - bool isPathStyle; - }; -} -} + /** + * Rate limit data upload speed. + */ + std::shared_ptr sendRateLimiter; + /** + * Rate limit data download speed. + */ + std::shared_ptr recvRateLimiter; + /** + * The interface for outgoing traffic. E.g. eth0 in linux + */ + std::string networkInterface; + /** + * Your executor's implement + */ + std::shared_ptr executor; + /** + * Your http client' implement + */ + std::shared_ptr httpClient; + /** + * enable or disable path style, default is false. + */ + bool isPathStyle; +}; +} // namespace OSS +} // namespace AlibabaCloud diff --git a/sdk/include/alibabacloud/oss/http/HttpClient.h b/sdk/include/alibabacloud/oss/http/HttpClient.h index 193064c..9457dbb 100644 --- a/sdk/include/alibabacloud/oss/http/HttpClient.h +++ b/sdk/include/alibabacloud/oss/http/HttpClient.h @@ -1,12 +1,12 @@ /* * Copyright 2009-2017 Alibaba Cloud All rights reserved. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -16,35 +16,44 @@ #pragma once -#include -#include -#include -#include #include #include +#include +#include +#include +#include +#ifdef USE_CPP20 +#include +#include +#endif + +namespace AlibabaCloud { +namespace OSS { + +class ALIBABACLOUD_OSS_EXPORT HttpClient { +public: + HttpClient(); + virtual ~HttpClient(); + + virtual std::shared_ptr + makeRequest(const std::shared_ptr &request) = 0; + +#ifdef USE_CPP20 + virtual async_simple::coro::Lazy> + makeRequestAsync(const std::shared_ptr &) { + co_return nullptr; + } +#endif + + bool isEnable(); + void disable(); + void enable(); + void waitForRetry(long milliseconds); -namespace AlibabaCloud -{ -namespace OSS -{ - - class ALIBABACLOUD_OSS_EXPORT HttpClient - { - public: - HttpClient(); - virtual ~HttpClient(); - - virtual std::shared_ptr makeRequest(const std::shared_ptr &request) = 0; - - bool isEnable(); - void disable(); - void enable(); - void waitForRetry(long milliseconds); - - protected: - std::atomic disable_; - std::mutex requestLock_; - std::condition_variable requestSignal_; - }; -} -} +protected: + std::atomic disable_; + std::mutex requestLock_; + std::condition_variable requestSignal_; +}; +} // namespace OSS +} // namespace AlibabaCloud diff --git a/sdk/src/OssClient.cc b/sdk/src/OssClient.cc index 2e881e7..d87d920 100644 --- a/sdk/src/OssClient.cc +++ b/sdk/src/OssClient.cc @@ -1,1008 +1,1014 @@ /* -* Copyright 2009-2017 Alibaba Cloud All rights reserved. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2009-2017 Alibaba Cloud All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ -#include -#include "http/CurlHttpClient.h" #include "OssClientImpl.h" -#include -#include "utils/LogUtils.h" +#include "http/CurlHttpClient.h" #include "utils/Crc64.h" +#include "utils/LogUtils.h" +#include +#include using namespace AlibabaCloud::OSS; static bool SdkInitDone = false; -bool AlibabaCloud::OSS::IsSdkInitialized() -{ - return SdkInitDone; -} +bool AlibabaCloud::OSS::IsSdkInitialized() { return SdkInitDone; } -void AlibabaCloud::OSS::InitializeSdk() -{ - if (IsSdkInitialized()) - return; - InitLogInner(); - CurlHttpClient::initGlobalState(); - SdkInitDone = true; +void AlibabaCloud::OSS::InitializeSdk() { + if (IsSdkInitialized()) + return; + InitLogInner(); + CurlHttpClient::initGlobalState(); + SdkInitDone = true; } -void AlibabaCloud::OSS::ShutdownSdk() -{ - if (!IsSdkInitialized()) - return; - - CurlHttpClient::cleanupGlobalState(); - DeinitLogInner(); - SdkInitDone = false; +void AlibabaCloud::OSS::ShutdownSdk() { + if (!IsSdkInitialized()) + return; + + CurlHttpClient::cleanupGlobalState(); + DeinitLogInner(); + SdkInitDone = false; } /////////////////////////////////////////////////////////////////////////////////////////////////////// -void AlibabaCloud::OSS::SetLogLevel(LogLevel level) -{ - SetLogLevelInner(level); -} +void AlibabaCloud::OSS::SetLogLevel(LogLevel level) { SetLogLevelInner(level); } -void AlibabaCloud::OSS::SetLogCallback(LogCallback callback) -{ - SetLogCallbackInner(callback); +void AlibabaCloud::OSS::SetLogCallback(LogCallback callback) { + SetLogCallbackInner(callback); } //////////////////////////////////////////////////////////////////////////////////////////////////// -uint64_t AlibabaCloud::OSS::ComputeCRC64(uint64_t crc, void *buf, size_t len) -{ - return CRC64::CalcCRC(crc, buf, len); +uint64_t AlibabaCloud::OSS::ComputeCRC64(uint64_t crc, void *buf, size_t len) { + return CRC64::CalcCRC(crc, buf, len); } -uint64_t AlibabaCloud::OSS::CombineCRC64(uint64_t crc1, uint64_t crc2, uintmax_t len2) -{ - return CRC64::CombineCRC(crc1, crc2, len2); +uint64_t AlibabaCloud::OSS::CombineCRC64(uint64_t crc1, uint64_t crc2, + uintmax_t len2) { + return CRC64::CombineCRC(crc1, crc2, len2); } /////////////////////////////////////////////////////////////////////////////////////////////////////// -OssClient::OssClient(const std::string &endpoint, const std::string & accessKeyId, const std::string & accessKeySecret, const ClientConfiguration & configuration) : - OssClient(endpoint, accessKeyId, accessKeySecret, "", configuration) -{ -} - -OssClient::OssClient(const std::string &endpoint, const std::string & accessKeyId, const std::string & accessKeySecret, const std::string & securityToken, - const ClientConfiguration & configuration) : - OssClient(endpoint, std::make_shared(accessKeyId, accessKeySecret, securityToken), configuration) -{ -} - -OssClient::OssClient(const std::string &endpoint, const Credentials &credentials, const ClientConfiguration &configuration) : - OssClient(endpoint, std::make_shared(credentials), configuration) -{ -} +OssClient::OssClient(const std::string &endpoint, + const std::string &accessKeyId, + const std::string &accessKeySecret, + const ClientConfiguration &configuration) + : OssClient(endpoint, accessKeyId, accessKeySecret, "", configuration) {} + +OssClient::OssClient(const std::string &endpoint, + const std::string &accessKeyId, + const std::string &accessKeySecret, + const std::string &securityToken, + const ClientConfiguration &configuration) + : OssClient(endpoint, + std::make_shared( + accessKeyId, accessKeySecret, securityToken), + configuration) {} + +OssClient::OssClient(const std::string &endpoint, + const Credentials &credentials, + const ClientConfiguration &configuration) + : OssClient(endpoint, + std::make_shared(credentials), + configuration) {} + +OssClient::OssClient( + const std::string &endpoint, + const std::shared_ptr &credentialsProvider, + const ClientConfiguration &configuration) + : client_(std::make_shared(endpoint, credentialsProvider, + configuration)) {} + +OssClient::~OssClient() {} -OssClient::OssClient(const std::string &endpoint, const std::shared_ptr& credentialsProvider, const ClientConfiguration & configuration) : - client_(std::make_shared(endpoint, credentialsProvider, configuration)) -{ -} +#if !defined(OSS_DISABLE_BUCKET) -OssClient::~OssClient() -{ +ListBucketsOutcome OssClient::ListBuckets() const { + return client_->ListBuckets(ListBucketsRequest()); } -#if !defined(OSS_DISABLE_BUCKET) - -ListBucketsOutcome OssClient::ListBuckets() const -{ - return client_->ListBuckets(ListBucketsRequest()); +ListBucketsOutcome +OssClient::ListBuckets(const ListBucketsRequest &request) const { + return client_->ListBuckets(request); } -ListBucketsOutcome OssClient::ListBuckets(const ListBucketsRequest &request) const -{ - return client_->ListBuckets(request); +ListBucketInventoryConfigurationsOutcome +OssClient::ListBucketInventoryConfigurations( + const ListBucketInventoryConfigurationsRequest &request) const { + return client_->ListBucketInventoryConfigurations(request); } -ListBucketInventoryConfigurationsOutcome OssClient::ListBucketInventoryConfigurations(const ListBucketInventoryConfigurationsRequest& request) const -{ - return client_->ListBucketInventoryConfigurations(request); +CreateBucketOutcome OssClient::CreateBucket(const std::string &bucket, + StorageClass storageClass) const { + return client_->CreateBucket(CreateBucketRequest(bucket, storageClass)); } -CreateBucketOutcome OssClient::CreateBucket(const std::string &bucket, StorageClass storageClass) const -{ - return client_->CreateBucket(CreateBucketRequest(bucket, storageClass)); +CreateBucketOutcome OssClient::CreateBucket(const std::string &bucket, + StorageClass storageClass, + CannedAccessControlList acl) const { + return client_->CreateBucket(CreateBucketRequest(bucket, storageClass, acl)); } -CreateBucketOutcome OssClient::CreateBucket(const std::string &bucket, StorageClass storageClass, CannedAccessControlList acl) const -{ - return client_->CreateBucket(CreateBucketRequest(bucket, storageClass, acl)); +CreateBucketOutcome +OssClient::CreateBucket(const CreateBucketRequest &request) const { + return client_->CreateBucket(request); } -CreateBucketOutcome OssClient::CreateBucket(const CreateBucketRequest &request) const -{ - return client_->CreateBucket(request); +#ifdef USE_CPP20 +async_simple::coro::Lazy +OssClient::CreateBucketAsync(const CreateBucketRequest &request) const { + auto ret = co_await client_->CreateBucketAsync(request); + co_return ret; } +#endif -VoidOutcome OssClient::SetBucketAcl(const std::string &bucket, CannedAccessControlList acl) const -{ - return client_->SetBucketAcl(SetBucketAclRequest(bucket, acl)); +VoidOutcome OssClient::SetBucketAcl(const std::string &bucket, + CannedAccessControlList acl) const { + return client_->SetBucketAcl(SetBucketAclRequest(bucket, acl)); } -VoidOutcome OssClient::SetBucketAcl(const SetBucketAclRequest& request) const -{ - return client_->SetBucketAcl(request); +VoidOutcome OssClient::SetBucketAcl(const SetBucketAclRequest &request) const { + return client_->SetBucketAcl(request); } -VoidOutcome OssClient::SetBucketLogging(const std::string &bucket, const std::string &targetBucket, const std::string &targetPrefix) const -{ - return client_->SetBucketLogging(SetBucketLoggingRequest(bucket, targetBucket, targetPrefix)); +VoidOutcome OssClient::SetBucketLogging(const std::string &bucket, + const std::string &targetBucket, + const std::string &targetPrefix) const { + return client_->SetBucketLogging( + SetBucketLoggingRequest(bucket, targetBucket, targetPrefix)); } -VoidOutcome OssClient::SetBucketLogging(const SetBucketLoggingRequest& request) const -{ - return client_->SetBucketLogging(request); +VoidOutcome +OssClient::SetBucketLogging(const SetBucketLoggingRequest &request) const { + return client_->SetBucketLogging(request); } -VoidOutcome OssClient::SetBucketWebsite(const std::string &bucket, const std::string &indexDocument) const -{ - SetBucketWebsiteRequest request(bucket); - request.setIndexDocument(indexDocument); - return client_->SetBucketWebsite(request); +VoidOutcome +OssClient::SetBucketWebsite(const std::string &bucket, + const std::string &indexDocument) const { + SetBucketWebsiteRequest request(bucket); + request.setIndexDocument(indexDocument); + return client_->SetBucketWebsite(request); } -VoidOutcome OssClient::SetBucketWebsite(const std::string &bucket, const std::string &indexDocument, const std::string &errorDocument) const -{ - SetBucketWebsiteRequest request(bucket); - request.setIndexDocument(indexDocument); - request.setErrorDocument(errorDocument); - return client_->SetBucketWebsite(request); +VoidOutcome +OssClient::SetBucketWebsite(const std::string &bucket, + const std::string &indexDocument, + const std::string &errorDocument) const { + SetBucketWebsiteRequest request(bucket); + request.setIndexDocument(indexDocument); + request.setErrorDocument(errorDocument); + return client_->SetBucketWebsite(request); } -VoidOutcome OssClient::SetBucketWebsite(const SetBucketWebsiteRequest& request) const -{ - return client_->SetBucketWebsite(request); +VoidOutcome +OssClient::SetBucketWebsite(const SetBucketWebsiteRequest &request) const { + return client_->SetBucketWebsite(request); } -VoidOutcome OssClient::SetBucketReferer(const std::string &bucket, const RefererList &refererList, bool allowEmptyReferer) const -{ - return client_->SetBucketReferer(SetBucketRefererRequest(bucket, refererList, allowEmptyReferer)); +VoidOutcome OssClient::SetBucketReferer(const std::string &bucket, + const RefererList &refererList, + bool allowEmptyReferer) const { + return client_->SetBucketReferer( + SetBucketRefererRequest(bucket, refererList, allowEmptyReferer)); } -VoidOutcome OssClient::SetBucketReferer(const SetBucketRefererRequest& request) const -{ - return client_->SetBucketReferer(request); +VoidOutcome +OssClient::SetBucketReferer(const SetBucketRefererRequest &request) const { + return client_->SetBucketReferer(request); } -VoidOutcome OssClient::SetBucketLifecycle(const SetBucketLifecycleRequest& request) const -{ - return client_->SetBucketLifecycle(request); +VoidOutcome +OssClient::SetBucketLifecycle(const SetBucketLifecycleRequest &request) const { + return client_->SetBucketLifecycle(request); } -VoidOutcome OssClient::SetBucketCors(const std::string &bucket, const CORSRuleList &rules) const -{ - SetBucketCorsRequest request(bucket); - request.setCORSRules(rules); - return client_->SetBucketCors(request); +VoidOutcome OssClient::SetBucketCors(const std::string &bucket, + const CORSRuleList &rules) const { + SetBucketCorsRequest request(bucket); + request.setCORSRules(rules); + return client_->SetBucketCors(request); } -VoidOutcome OssClient::SetBucketCors(const SetBucketCorsRequest& request) const -{ - return client_->SetBucketCors(request); +VoidOutcome +OssClient::SetBucketCors(const SetBucketCorsRequest &request) const { + return client_->SetBucketCors(request); } -VoidOutcome OssClient::SetBucketStorageCapacity(const std::string &bucket, int64_t storageCapacity) const -{ - return client_->SetBucketStorageCapacity(SetBucketStorageCapacityRequest(bucket, storageCapacity)); +VoidOutcome OssClient::SetBucketStorageCapacity(const std::string &bucket, + int64_t storageCapacity) const { + return client_->SetBucketStorageCapacity( + SetBucketStorageCapacityRequest(bucket, storageCapacity)); } -VoidOutcome OssClient::SetBucketStorageCapacity(const SetBucketStorageCapacityRequest& request) const -{ - return client_->SetBucketStorageCapacity(request); +VoidOutcome OssClient::SetBucketStorageCapacity( + const SetBucketStorageCapacityRequest &request) const { + return client_->SetBucketStorageCapacity(request); } -VoidOutcome OssClient::SetBucketPolicy(const SetBucketPolicyRequest& request) const -{ - return client_->SetBucketPolicy(request); +VoidOutcome +OssClient::SetBucketPolicy(const SetBucketPolicyRequest &request) const { + return client_->SetBucketPolicy(request); } -VoidOutcome OssClient::SetBucketRequestPayment(const SetBucketRequestPaymentRequest& request) const -{ - return client_->SetBucketRequestPayment(request); +VoidOutcome OssClient::SetBucketRequestPayment( + const SetBucketRequestPaymentRequest &request) const { + return client_->SetBucketRequestPayment(request); } -VoidOutcome OssClient::SetBucketEncryption(const SetBucketEncryptionRequest& request) const -{ - return client_->SetBucketEncryption(request); +VoidOutcome OssClient::SetBucketEncryption( + const SetBucketEncryptionRequest &request) const { + return client_->SetBucketEncryption(request); } -VoidOutcome OssClient::SetBucketTagging(const SetBucketTaggingRequest& request) const -{ - return client_->SetBucketTagging(request); +VoidOutcome +OssClient::SetBucketTagging(const SetBucketTaggingRequest &request) const { + return client_->SetBucketTagging(request); } -VoidOutcome OssClient::SetBucketQosInfo(const SetBucketQosInfoRequest& request) const -{ - return client_->SetBucketQosInfo(request); +VoidOutcome +OssClient::SetBucketQosInfo(const SetBucketQosInfoRequest &request) const { + return client_->SetBucketQosInfo(request); } -VoidOutcome OssClient::DeleteBucketPolicy(const DeleteBucketPolicyRequest& request) const -{ - return client_->DeleteBucketPolicy(request); +VoidOutcome +OssClient::DeleteBucketPolicy(const DeleteBucketPolicyRequest &request) const { + return client_->DeleteBucketPolicy(request); } -VoidOutcome OssClient::SetBucketVersioning(const SetBucketVersioningRequest& request) const -{ - return client_->SetBucketVersioning(request); +VoidOutcome OssClient::SetBucketVersioning( + const SetBucketVersioningRequest &request) const { + return client_->SetBucketVersioning(request); } -VoidOutcome OssClient::SetBucketInventoryConfiguration(const SetBucketInventoryConfigurationRequest& request) const -{ - return client_->SetBucketInventoryConfiguration(request); +VoidOutcome OssClient::SetBucketInventoryConfiguration( + const SetBucketInventoryConfigurationRequest &request) const { + return client_->SetBucketInventoryConfiguration(request); } -VoidOutcome OssClient::DeleteBucket(const std::string &bucket) const -{ - return client_->DeleteBucket(DeleteBucketRequest(bucket)); +VoidOutcome OssClient::DeleteBucket(const std::string &bucket) const { + return client_->DeleteBucket(DeleteBucketRequest(bucket)); } -VoidOutcome OssClient::DeleteBucket(const DeleteBucketRequest &request) const -{ - return client_->DeleteBucket(request); +VoidOutcome OssClient::DeleteBucket(const DeleteBucketRequest &request) const { + return client_->DeleteBucket(request); } -VoidOutcome OssClient::DeleteBucketLogging(const std::string &bucket) const -{ - return client_->DeleteBucketLogging(DeleteBucketLoggingRequest(bucket)); +VoidOutcome OssClient::DeleteBucketLogging(const std::string &bucket) const { + return client_->DeleteBucketLogging(DeleteBucketLoggingRequest(bucket)); } -VoidOutcome OssClient::DeleteBucketLogging(const DeleteBucketLoggingRequest& request) const -{ - return client_->DeleteBucketLogging(request); +VoidOutcome OssClient::DeleteBucketLogging( + const DeleteBucketLoggingRequest &request) const { + return client_->DeleteBucketLogging(request); } -VoidOutcome OssClient::DeleteBucketWebsite(const std::string &bucket) const -{ - return client_->DeleteBucketWebsite(DeleteBucketWebsiteRequest(bucket)); +VoidOutcome OssClient::DeleteBucketWebsite(const std::string &bucket) const { + return client_->DeleteBucketWebsite(DeleteBucketWebsiteRequest(bucket)); } -VoidOutcome OssClient::DeleteBucketWebsite(const DeleteBucketWebsiteRequest& request) const -{ - return client_->DeleteBucketWebsite(request); +VoidOutcome OssClient::DeleteBucketWebsite( + const DeleteBucketWebsiteRequest &request) const { + return client_->DeleteBucketWebsite(request); } -VoidOutcome OssClient::DeleteBucketLifecycle(const std::string &bucket) const -{ - return client_->DeleteBucketLifecycle(DeleteBucketLifecycleRequest(bucket)); +VoidOutcome OssClient::DeleteBucketLifecycle(const std::string &bucket) const { + return client_->DeleteBucketLifecycle(DeleteBucketLifecycleRequest(bucket)); } -VoidOutcome OssClient::DeleteBucketLifecycle(const DeleteBucketLifecycleRequest& request) const -{ - return client_->DeleteBucketLifecycle(request); +VoidOutcome OssClient::DeleteBucketLifecycle( + const DeleteBucketLifecycleRequest &request) const { + return client_->DeleteBucketLifecycle(request); } -VoidOutcome OssClient::DeleteBucketCors(const std::string &bucket) const -{ - return client_->DeleteBucketCors(DeleteBucketCorsRequest(bucket)); +VoidOutcome OssClient::DeleteBucketCors(const std::string &bucket) const { + return client_->DeleteBucketCors(DeleteBucketCorsRequest(bucket)); } -VoidOutcome OssClient::DeleteBucketCors(const DeleteBucketCorsRequest& request) const -{ - return client_->DeleteBucketCors(request); +VoidOutcome +OssClient::DeleteBucketCors(const DeleteBucketCorsRequest &request) const { + return client_->DeleteBucketCors(request); } -VoidOutcome OssClient::DeleteBucketEncryption(const DeleteBucketEncryptionRequest& request) const -{ - return client_->DeleteBucketEncryption(request); +VoidOutcome OssClient::DeleteBucketEncryption( + const DeleteBucketEncryptionRequest &request) const { + return client_->DeleteBucketEncryption(request); } -VoidOutcome OssClient::DeleteBucketTagging(const DeleteBucketTaggingRequest& request) const -{ - return client_->DeleteBucketTagging(request); +VoidOutcome OssClient::DeleteBucketTagging( + const DeleteBucketTaggingRequest &request) const { + return client_->DeleteBucketTagging(request); } -VoidOutcome OssClient::DeleteBucketQosInfo(const DeleteBucketQosInfoRequest& request) const -{ - return client_->DeleteBucketQosInfo(request); +VoidOutcome OssClient::DeleteBucketQosInfo( + const DeleteBucketQosInfoRequest &request) const { + return client_->DeleteBucketQosInfo(request); } -VoidOutcome OssClient::DeleteBucketInventoryConfiguration(const DeleteBucketInventoryConfigurationRequest& request) const -{ - return client_->DeleteBucketInventoryConfiguration(request); +VoidOutcome OssClient::DeleteBucketInventoryConfiguration( + const DeleteBucketInventoryConfigurationRequest &request) const { + return client_->DeleteBucketInventoryConfiguration(request); } -GetBucketAclOutcome OssClient::GetBucketAcl(const std::string &bucket) const -{ - return client_->GetBucketAcl(GetBucketAclRequest(bucket)); +GetBucketAclOutcome OssClient::GetBucketAcl(const std::string &bucket) const { + return client_->GetBucketAcl(GetBucketAclRequest(bucket)); } -GetBucketAclOutcome OssClient::GetBucketAcl(const GetBucketAclRequest &request) const -{ - return client_->GetBucketAcl(request); +GetBucketAclOutcome +OssClient::GetBucketAcl(const GetBucketAclRequest &request) const { + return client_->GetBucketAcl(request); } -GetBucketLocationOutcome OssClient::GetBucketLocation(const std::string &bucket) const -{ - return client_->GetBucketLocation(GetBucketLocationRequest(bucket)); +GetBucketLocationOutcome +OssClient::GetBucketLocation(const std::string &bucket) const { + return client_->GetBucketLocation(GetBucketLocationRequest(bucket)); } -GetBucketLocationOutcome OssClient::GetBucketLocation(const GetBucketLocationRequest &request) const -{ - return client_->GetBucketLocation(request); +GetBucketLocationOutcome +OssClient::GetBucketLocation(const GetBucketLocationRequest &request) const { + return client_->GetBucketLocation(request); } -GetBucketInfoOutcome OssClient::GetBucketInfo(const std::string &bucket) const -{ - return client_->GetBucketInfo(GetBucketInfoRequest(bucket)); +GetBucketInfoOutcome OssClient::GetBucketInfo(const std::string &bucket) const { + return client_->GetBucketInfo(GetBucketInfoRequest(bucket)); } -GetBucketInfoOutcome OssClient::GetBucketInfo(const GetBucketInfoRequest &request) const -{ - return client_->GetBucketInfo(request); +GetBucketInfoOutcome +OssClient::GetBucketInfo(const GetBucketInfoRequest &request) const { + return client_->GetBucketInfo(request); } -GetBucketLoggingOutcome OssClient::GetBucketLogging(const std::string &bucket) const -{ - return client_->GetBucketLogging(GetBucketLoggingRequest(bucket)); +GetBucketLoggingOutcome +OssClient::GetBucketLogging(const std::string &bucket) const { + return client_->GetBucketLogging(GetBucketLoggingRequest(bucket)); } -GetBucketLoggingOutcome OssClient::GetBucketLogging(const GetBucketLoggingRequest &request) const -{ - return client_->GetBucketLogging(request); +GetBucketLoggingOutcome +OssClient::GetBucketLogging(const GetBucketLoggingRequest &request) const { + return client_->GetBucketLogging(request); } -GetBucketWebsiteOutcome OssClient::GetBucketWebsite(const std::string &bucket) const -{ - return client_->GetBucketWebsite(GetBucketWebsiteRequest(bucket)); +GetBucketWebsiteOutcome +OssClient::GetBucketWebsite(const std::string &bucket) const { + return client_->GetBucketWebsite(GetBucketWebsiteRequest(bucket)); } -GetBucketWebsiteOutcome OssClient::GetBucketWebsite(const GetBucketWebsiteRequest &request) const -{ - return client_->GetBucketWebsite(request); +GetBucketWebsiteOutcome +OssClient::GetBucketWebsite(const GetBucketWebsiteRequest &request) const { + return client_->GetBucketWebsite(request); } -GetBucketRefererOutcome OssClient::GetBucketReferer(const std::string &bucket) const -{ - return client_->GetBucketReferer(GetBucketRefererRequest(bucket)); +GetBucketRefererOutcome +OssClient::GetBucketReferer(const std::string &bucket) const { + return client_->GetBucketReferer(GetBucketRefererRequest(bucket)); } -GetBucketRefererOutcome OssClient::GetBucketReferer(const GetBucketRefererRequest &request) const -{ - return client_->GetBucketReferer(request); +GetBucketRefererOutcome +OssClient::GetBucketReferer(const GetBucketRefererRequest &request) const { + return client_->GetBucketReferer(request); } -GetBucketLifecycleOutcome OssClient::GetBucketLifecycle(const std::string &bucket) const -{ - return client_->GetBucketLifecycle(GetBucketLifecycleRequest(bucket)); +GetBucketLifecycleOutcome +OssClient::GetBucketLifecycle(const std::string &bucket) const { + return client_->GetBucketLifecycle(GetBucketLifecycleRequest(bucket)); } -GetBucketLifecycleOutcome OssClient::GetBucketLifecycle(const GetBucketLifecycleRequest &request) const -{ - return client_->GetBucketLifecycle(request); +GetBucketLifecycleOutcome +OssClient::GetBucketLifecycle(const GetBucketLifecycleRequest &request) const { + return client_->GetBucketLifecycle(request); } -GetBucketStatOutcome OssClient::GetBucketStat(const std::string &bucket) const -{ - return client_->GetBucketStat(GetBucketStatRequest(bucket)); +GetBucketStatOutcome OssClient::GetBucketStat(const std::string &bucket) const { + return client_->GetBucketStat(GetBucketStatRequest(bucket)); } -GetBucketStatOutcome OssClient::GetBucketStat(const GetBucketStatRequest &request) const -{ - return client_->GetBucketStat(request); +GetBucketStatOutcome +OssClient::GetBucketStat(const GetBucketStatRequest &request) const { + return client_->GetBucketStat(request); } -GetBucketCorsOutcome OssClient::GetBucketCors(const std::string &bucket) const -{ - return client_->GetBucketCors(GetBucketCorsRequest(bucket)); +GetBucketCorsOutcome OssClient::GetBucketCors(const std::string &bucket) const { + return client_->GetBucketCors(GetBucketCorsRequest(bucket)); } -GetBucketCorsOutcome OssClient::GetBucketCors(const GetBucketCorsRequest &request) const -{ - return client_->GetBucketCors(request); +GetBucketCorsOutcome +OssClient::GetBucketCors(const GetBucketCorsRequest &request) const { + return client_->GetBucketCors(request); } -GetBucketStorageCapacityOutcome OssClient::GetBucketStorageCapacity(const std::string &bucket) const -{ - return client_->GetBucketStorageCapacity(GetBucketStorageCapacityRequest(bucket)); +GetBucketStorageCapacityOutcome +OssClient::GetBucketStorageCapacity(const std::string &bucket) const { + return client_->GetBucketStorageCapacity( + GetBucketStorageCapacityRequest(bucket)); } -GetBucketStorageCapacityOutcome OssClient::GetBucketStorageCapacity(const GetBucketStorageCapacityRequest& request) const -{ - return client_->GetBucketStorageCapacity(request); +GetBucketStorageCapacityOutcome OssClient::GetBucketStorageCapacity( + const GetBucketStorageCapacityRequest &request) const { + return client_->GetBucketStorageCapacity(request); } -GetBucketPolicyOutcome OssClient::GetBucketPolicy(const GetBucketPolicyRequest& request) const -{ - return client_->GetBucketPolicy(request); +GetBucketPolicyOutcome +OssClient::GetBucketPolicy(const GetBucketPolicyRequest &request) const { + return client_->GetBucketPolicy(request); } -GetBucketPaymentOutcome OssClient::GetBucketRequestPayment(const GetBucketRequestPaymentRequest& request) const -{ - return client_->GetBucketRequestPayment(request); +GetBucketPaymentOutcome OssClient::GetBucketRequestPayment( + const GetBucketRequestPaymentRequest &request) const { + return client_->GetBucketRequestPayment(request); } -GetBucketEncryptionOutcome OssClient::GetBucketEncryption(const GetBucketEncryptionRequest& request) const -{ - return client_->GetBucketEncryption(request); +GetBucketEncryptionOutcome OssClient::GetBucketEncryption( + const GetBucketEncryptionRequest &request) const { + return client_->GetBucketEncryption(request); } -GetBucketTaggingOutcome OssClient::GetBucketTagging(const GetBucketTaggingRequest& request) const -{ - return client_->GetBucketTagging(request); +GetBucketTaggingOutcome +OssClient::GetBucketTagging(const GetBucketTaggingRequest &request) const { + return client_->GetBucketTagging(request); } -GetBucketQosInfoOutcome OssClient::GetBucketQosInfo(const GetBucketQosInfoRequest& request) const -{ - return client_->GetBucketQosInfo(request); +GetBucketQosInfoOutcome +OssClient::GetBucketQosInfo(const GetBucketQosInfoRequest &request) const { + return client_->GetBucketQosInfo(request); } -GetUserQosInfoOutcome OssClient::GetUserQosInfo(const GetUserQosInfoRequest& request) const -{ - return client_->GetUserQosInfo(request); +GetUserQosInfoOutcome +OssClient::GetUserQosInfo(const GetUserQosInfoRequest &request) const { + return client_->GetUserQosInfo(request); } -GetBucketVersioningOutcome OssClient::GetBucketVersioning(const GetBucketVersioningRequest& request) const -{ - return client_->GetBucketVersioning(request); +GetBucketVersioningOutcome OssClient::GetBucketVersioning( + const GetBucketVersioningRequest &request) const { + return client_->GetBucketVersioning(request); } -GetBucketInventoryConfigurationOutcome OssClient::GetBucketInventoryConfiguration(const GetBucketInventoryConfigurationRequest& request) const -{ - return client_->GetBucketInventoryConfiguration(request); +GetBucketInventoryConfigurationOutcome +OssClient::GetBucketInventoryConfiguration( + const GetBucketInventoryConfigurationRequest &request) const { + return client_->GetBucketInventoryConfiguration(request); } -InitiateBucketWormOutcome OssClient::InitiateBucketWorm(const InitiateBucketWormRequest& request) const -{ - return client_->InitiateBucketWorm(request); +InitiateBucketWormOutcome +OssClient::InitiateBucketWorm(const InitiateBucketWormRequest &request) const { + return client_->InitiateBucketWorm(request); } -VoidOutcome OssClient::AbortBucketWorm(const AbortBucketWormRequest& request) const -{ - return client_->AbortBucketWorm(request); +VoidOutcome +OssClient::AbortBucketWorm(const AbortBucketWormRequest &request) const { + return client_->AbortBucketWorm(request); } -VoidOutcome OssClient::CompleteBucketWorm(const CompleteBucketWormRequest& request) const -{ - return client_->CompleteBucketWorm(request); +VoidOutcome +OssClient::CompleteBucketWorm(const CompleteBucketWormRequest &request) const { + return client_->CompleteBucketWorm(request); } -VoidOutcome OssClient::ExtendBucketWormWorm(const ExtendBucketWormRequest& request) const -{ - return client_->ExtendBucketWormWorm(request); +VoidOutcome +OssClient::ExtendBucketWormWorm(const ExtendBucketWormRequest &request) const { + return client_->ExtendBucketWormWorm(request); } -GetBucketWormOutcome OssClient::GetBucketWorm(const GetBucketWormRequest& request) const -{ - return client_->GetBucketWorm(request); +GetBucketWormOutcome +OssClient::GetBucketWorm(const GetBucketWormRequest &request) const { + return client_->GetBucketWorm(request); } #endif -ListObjectOutcome OssClient::ListObjects(const std::string &bucket) const -{ - return client_->ListObjects(ListObjectsRequest(bucket)); +ListObjectOutcome OssClient::ListObjects(const std::string &bucket) const { + return client_->ListObjects(ListObjectsRequest(bucket)); } -ListObjectOutcome OssClient::ListObjects(const std::string &bucket, const std::string &prefix) const -{ - ListObjectsRequest request(bucket); - request.setPrefix(prefix); - return client_->ListObjects(request); +ListObjectOutcome OssClient::ListObjects(const std::string &bucket, + const std::string &prefix) const { + ListObjectsRequest request(bucket); + request.setPrefix(prefix); + return client_->ListObjects(request); } -ListObjectOutcome OssClient::ListObjects(const ListObjectsRequest &request) const -{ - return client_->ListObjects(request); +ListObjectOutcome +OssClient::ListObjects(const ListObjectsRequest &request) const { + return client_->ListObjects(request); } -ListObjectsV2Outcome OssClient::ListObjectsV2(const ListObjectsV2Request& request) const -{ - return client_->ListObjectsV2(request); +ListObjectsV2Outcome +OssClient::ListObjectsV2(const ListObjectsV2Request &request) const { + return client_->ListObjectsV2(request); } -ListObjectVersionsOutcome OssClient::ListObjectVersions(const std::string &bucket) const -{ - return client_->ListObjectVersions(ListObjectVersionsRequest(bucket)); +ListObjectVersionsOutcome +OssClient::ListObjectVersions(const std::string &bucket) const { + return client_->ListObjectVersions(ListObjectVersionsRequest(bucket)); } -ListObjectVersionsOutcome OssClient::ListObjectVersions(const std::string &bucket, const std::string &prefix) const -{ - ListObjectVersionsRequest request(bucket); - request.setPrefix(prefix); - return client_->ListObjectVersions(request); +ListObjectVersionsOutcome +OssClient::ListObjectVersions(const std::string &bucket, + const std::string &prefix) const { + ListObjectVersionsRequest request(bucket); + request.setPrefix(prefix); + return client_->ListObjectVersions(request); } -ListObjectVersionsOutcome OssClient::ListObjectVersions(const ListObjectVersionsRequest& request) const -{ - return client_->ListObjectVersions(request); +ListObjectVersionsOutcome +OssClient::ListObjectVersions(const ListObjectVersionsRequest &request) const { + return client_->ListObjectVersions(request); } -GetObjectOutcome OssClient::GetObject(const std::string &bucket, const std::string &key) const -{ - return client_->GetObject(GetObjectRequest(bucket, key)); +GetObjectOutcome OssClient::GetObject(const std::string &bucket, + const std::string &key) const { + return client_->GetObject(GetObjectRequest(bucket, key)); } -GetObjectOutcome OssClient::GetObject(const std::string &bucket, const std::string &key, const std::shared_ptr &content) const -{ - GetObjectRequest request(bucket, key); - request.setResponseStreamFactory([=]() { return content; }); - return client_->GetObject(request); +GetObjectOutcome +OssClient::GetObject(const std::string &bucket, const std::string &key, + const std::shared_ptr &content) const { + GetObjectRequest request(bucket, key); + request.setResponseStreamFactory([=]() { return content; }); + return client_->GetObject(request); } -GetObjectOutcome OssClient::GetObject(const std::string &bucket, const std::string &key, const std::string &fileToSave) const -{ - GetObjectRequest request(bucket, key); - request.setResponseStreamFactory([=]() {return std::make_shared(fileToSave, std::ios_base::out | std::ios_base::trunc | std::ios::binary); }); - return client_->GetObject(request); +GetObjectOutcome OssClient::GetObject(const std::string &bucket, + const std::string &key, + const std::string &fileToSave) const { + GetObjectRequest request(bucket, key); + request.setResponseStreamFactory([=]() { + return std::make_shared(fileToSave, std::ios_base::out | + std::ios_base::trunc | + std::ios::binary); + }); + return client_->GetObject(request); } -GetObjectOutcome OssClient::GetObject(const GetObjectRequest &request) const -{ - return client_->GetObject(request); +GetObjectOutcome OssClient::GetObject(const GetObjectRequest &request) const { + return client_->GetObject(request); } -PutObjectOutcome OssClient::PutObject(const std::string &bucket, const std::string &key, const std::shared_ptr &content) const -{ - return client_->PutObject(PutObjectRequest(bucket, key, content)); +PutObjectOutcome +OssClient::PutObject(const std::string &bucket, const std::string &key, + const std::shared_ptr &content) const { + return client_->PutObject(PutObjectRequest(bucket, key, content)); } -PutObjectOutcome OssClient::PutObject(const std::string &bucket, const std::string &key, const std::string &fileToUpload) const -{ - std::shared_ptr content = std::make_shared(fileToUpload, std::ios::in|std::ios::binary); - return client_->PutObject(PutObjectRequest(bucket, key, content)); +PutObjectOutcome OssClient::PutObject(const std::string &bucket, + const std::string &key, + const std::string &fileToUpload) const { + std::shared_ptr content = std::make_shared( + fileToUpload, std::ios::in | std::ios::binary); + return client_->PutObject(PutObjectRequest(bucket, key, content)); } -PutObjectOutcome OssClient::PutObject(const std::string &bucket, const std::string &key, const std::shared_ptr &content, const ObjectMetaData &meta) const -{ - return client_->PutObject(PutObjectRequest(bucket, key, content, meta)); +PutObjectOutcome +OssClient::PutObject(const std::string &bucket, const std::string &key, + const std::shared_ptr &content, + const ObjectMetaData &meta) const { + return client_->PutObject(PutObjectRequest(bucket, key, content, meta)); } -PutObjectOutcome OssClient::PutObject(const std::string &bucket, const std::string &key, const std::string &fileToUpload, const ObjectMetaData &meta) const -{ - std::shared_ptr content = std::make_shared(fileToUpload, std::ios::in | std::ios::binary); - return client_->PutObject(PutObjectRequest(bucket, key, content, meta)); +PutObjectOutcome OssClient::PutObject(const std::string &bucket, + const std::string &key, + const std::string &fileToUpload, + const ObjectMetaData &meta) const { + std::shared_ptr content = std::make_shared( + fileToUpload, std::ios::in | std::ios::binary); + return client_->PutObject(PutObjectRequest(bucket, key, content, meta)); } -PutObjectOutcome OssClient::PutObject(const PutObjectRequest &request) const -{ - return client_->PutObject(request); +PutObjectOutcome OssClient::PutObject(const PutObjectRequest &request) const { + return client_->PutObject(request); } -DeleteObjectOutcome OssClient::DeleteObject(const std::string &bucket, const std::string &key) const -{ - return client_->DeleteObject(DeleteObjectRequest(bucket, key)); +DeleteObjectOutcome OssClient::DeleteObject(const std::string &bucket, + const std::string &key) const { + return client_->DeleteObject(DeleteObjectRequest(bucket, key)); } -DeleteObjectOutcome OssClient::DeleteObject(const DeleteObjectRequest &request) const -{ - return client_->DeleteObject(request); +DeleteObjectOutcome +OssClient::DeleteObject(const DeleteObjectRequest &request) const { + return client_->DeleteObject(request); } -DeleteObjecstOutcome OssClient::DeleteObjects(const std::string bucket, const DeletedKeyList &keyList) const -{ - DeleteObjectsRequest request(bucket); - request.setKeyList(keyList); - return client_->DeleteObjects(request); +DeleteObjecstOutcome +OssClient::DeleteObjects(const std::string bucket, + const DeletedKeyList &keyList) const { + DeleteObjectsRequest request(bucket); + request.setKeyList(keyList); + return client_->DeleteObjects(request); } -DeleteObjecstOutcome OssClient::DeleteObjects(const DeleteObjectsRequest &request) const -{ - return client_->DeleteObjects(request); +DeleteObjecstOutcome +OssClient::DeleteObjects(const DeleteObjectsRequest &request) const { + return client_->DeleteObjects(request); } -DeleteObjecVersionstOutcome OssClient::DeleteObjectVersions(const std::string bucket, const ObjectIdentifierList &objectList) const -{ - DeleteObjectVersionsRequest request(bucket); - request.setObjects(objectList); - return client_->DeleteObjectVersions(request); +DeleteObjecVersionstOutcome +OssClient::DeleteObjectVersions(const std::string bucket, + const ObjectIdentifierList &objectList) const { + DeleteObjectVersionsRequest request(bucket); + request.setObjects(objectList); + return client_->DeleteObjectVersions(request); } -DeleteObjecVersionstOutcome OssClient::DeleteObjectVersions(const DeleteObjectVersionsRequest &request) const -{ - return client_->DeleteObjectVersions(request); +DeleteObjecVersionstOutcome OssClient::DeleteObjectVersions( + const DeleteObjectVersionsRequest &request) const { + return client_->DeleteObjectVersions(request); } -ObjectMetaDataOutcome OssClient::HeadObject(const std::string &bucket, const std::string &key) const -{ - return client_->HeadObject(HeadObjectRequest(bucket, key)); +ObjectMetaDataOutcome OssClient::HeadObject(const std::string &bucket, + const std::string &key) const { + return client_->HeadObject(HeadObjectRequest(bucket, key)); } -ObjectMetaDataOutcome OssClient::HeadObject(const HeadObjectRequest &request) const -{ - return client_->HeadObject(request); +ObjectMetaDataOutcome +OssClient::HeadObject(const HeadObjectRequest &request) const { + return client_->HeadObject(request); } -ObjectMetaDataOutcome OssClient::GetObjectMeta(const std::string &bucket, const std::string &key) const -{ - return client_->GetObjectMeta(GetObjectMetaRequest(bucket, key)); +ObjectMetaDataOutcome OssClient::GetObjectMeta(const std::string &bucket, + const std::string &key) const { + return client_->GetObjectMeta(GetObjectMetaRequest(bucket, key)); } -ObjectMetaDataOutcome OssClient::GetObjectMeta(const GetObjectMetaRequest &request) const -{ - return client_->GetObjectMeta(request); +ObjectMetaDataOutcome +OssClient::GetObjectMeta(const GetObjectMetaRequest &request) const { + return client_->GetObjectMeta(request); } -GetObjectAclOutcome OssClient::GetObjectAcl(const GetObjectAclRequest &request) const -{ - return client_->GetObjectAcl(request); +GetObjectAclOutcome +OssClient::GetObjectAcl(const GetObjectAclRequest &request) const { + return client_->GetObjectAcl(request); } -AppendObjectOutcome OssClient::AppendObject(const AppendObjectRequest &request) const -{ - return client_->AppendObject(request); +AppendObjectOutcome +OssClient::AppendObject(const AppendObjectRequest &request) const { + return client_->AppendObject(request); } -CopyObjectOutcome OssClient::CopyObject(const CopyObjectRequest &request) const -{ - return client_->CopyObject(request); +CopyObjectOutcome +OssClient::CopyObject(const CopyObjectRequest &request) const { + return client_->CopyObject(request); } -GetSymlinkOutcome OssClient::GetSymlink(const GetSymlinkRequest &request) const -{ - return client_->GetSymlink(request); +GetSymlinkOutcome +OssClient::GetSymlink(const GetSymlinkRequest &request) const { + return client_->GetSymlink(request); } -GetObjectOutcome OssClient::ProcessObject(const ProcessObjectRequest &request) const -{ - return client_->ProcessObject(request); +GetObjectOutcome +OssClient::ProcessObject(const ProcessObjectRequest &request) const { + return client_->ProcessObject(request); } -RestoreObjectOutcome OssClient::RestoreObject(const std::string &bucket, const std::string &key) const -{ - return client_->RestoreObject(RestoreObjectRequest(bucket, key)); +RestoreObjectOutcome OssClient::RestoreObject(const std::string &bucket, + const std::string &key) const { + return client_->RestoreObject(RestoreObjectRequest(bucket, key)); } -RestoreObjectOutcome OssClient::RestoreObject(const RestoreObjectRequest &request) const -{ - return client_->RestoreObject(request); +RestoreObjectOutcome +OssClient::RestoreObject(const RestoreObjectRequest &request) const { + return client_->RestoreObject(request); } -CreateSymlinkOutcome OssClient::CreateSymlink(const CreateSymlinkRequest &request) const -{ - return client_->CreateSymlink(request); +CreateSymlinkOutcome +OssClient::CreateSymlink(const CreateSymlinkRequest &request) const { + return client_->CreateSymlink(request); } -SetObjectAclOutcome OssClient::SetObjectAcl(const SetObjectAclRequest &request) const -{ - return client_->SetObjectAcl(request); +SetObjectAclOutcome +OssClient::SetObjectAcl(const SetObjectAclRequest &request) const { + return client_->SetObjectAcl(request); } -GetObjectOutcome OssClient::SelectObject(const SelectObjectRequest &request) const -{ - return client_->SelectObject(request); +GetObjectOutcome +OssClient::SelectObject(const SelectObjectRequest &request) const { + return client_->SelectObject(request); } -CreateSelectObjectMetaOutcome OssClient::CreateSelectObjectMeta(const CreateSelectObjectMetaRequest &request) const -{ - return client_->CreateSelectObjectMeta(request); +CreateSelectObjectMetaOutcome OssClient::CreateSelectObjectMeta( + const CreateSelectObjectMetaRequest &request) const { + return client_->CreateSelectObjectMeta(request); } -SetObjectTaggingOutcome OssClient::SetObjectTagging(const SetObjectTaggingRequest& request) const -{ - return client_->SetObjectTagging(request); +SetObjectTaggingOutcome +OssClient::SetObjectTagging(const SetObjectTaggingRequest &request) const { + return client_->SetObjectTagging(request); } -DeleteObjectTaggingOutcome OssClient::DeleteObjectTagging(const DeleteObjectTaggingRequest& request) const -{ - return client_->DeleteObjectTagging(request); +DeleteObjectTaggingOutcome OssClient::DeleteObjectTagging( + const DeleteObjectTaggingRequest &request) const { + return client_->DeleteObjectTagging(request); } -GetObjectTaggingOutcome OssClient::GetObjectTagging(const GetObjectTaggingRequest& request) const -{ - return client_->GetObjectTagging(request); +GetObjectTaggingOutcome +OssClient::GetObjectTagging(const GetObjectTaggingRequest &request) const { + return client_->GetObjectTagging(request); } -StringOutcome OssClient::GeneratePresignedUrl(const GeneratePresignedUrlRequest &request) const -{ - return client_->GeneratePresignedUrl(request); +StringOutcome OssClient::GeneratePresignedUrl( + const GeneratePresignedUrlRequest &request) const { + return client_->GeneratePresignedUrl(request); } -StringOutcome OssClient::GeneratePresignedUrl(const std::string &bucket, const std::string &key) const -{ - return GeneratePresignedUrl(GeneratePresignedUrlRequest(bucket, key)); +StringOutcome OssClient::GeneratePresignedUrl(const std::string &bucket, + const std::string &key) const { + return GeneratePresignedUrl(GeneratePresignedUrlRequest(bucket, key)); } -StringOutcome OssClient::GeneratePresignedUrl(const std::string &bucket, const std::string &key, int64_t expires) const -{ - GeneratePresignedUrlRequest request(bucket, key); - request.setExpires(expires); - return GeneratePresignedUrl(request); +StringOutcome OssClient::GeneratePresignedUrl(const std::string &bucket, + const std::string &key, + int64_t expires) const { + GeneratePresignedUrlRequest request(bucket, key); + request.setExpires(expires); + return GeneratePresignedUrl(request); } -StringOutcome OssClient::GeneratePresignedUrl(const std::string &bucket, const std::string &key, int64_t expires, Http::Method method) const -{ - GeneratePresignedUrlRequest request(bucket, key, method); - request.setExpires(expires); - return GeneratePresignedUrl(request); +StringOutcome OssClient::GeneratePresignedUrl(const std::string &bucket, + const std::string &key, + int64_t expires, + Http::Method method) const { + GeneratePresignedUrlRequest request(bucket, key, method); + request.setExpires(expires); + return GeneratePresignedUrl(request); } -GetObjectOutcome OssClient::GetObjectByUrl(const GetObjectByUrlRequest &request) const -{ - return client_->GetObjectByUrl(request); +GetObjectOutcome +OssClient::GetObjectByUrl(const GetObjectByUrlRequest &request) const { + return client_->GetObjectByUrl(request); } -GetObjectOutcome OssClient::GetObjectByUrl(const std::string &url) const -{ - return client_->GetObjectByUrl(GetObjectByUrlRequest(url)); +GetObjectOutcome OssClient::GetObjectByUrl(const std::string &url) const { + return client_->GetObjectByUrl(GetObjectByUrlRequest(url)); } -GetObjectOutcome OssClient::GetObjectByUrl(const std::string &url, const std::string &file) const -{ - GetObjectByUrlRequest request(url); - request.setResponseStreamFactory([=]() {return std::make_shared(file, std::ios_base::out | std::ios_base::in | std::ios_base::trunc); }); - return client_->GetObjectByUrl(request); +GetObjectOutcome OssClient::GetObjectByUrl(const std::string &url, + const std::string &file) const { + GetObjectByUrlRequest request(url); + request.setResponseStreamFactory([=]() { + return std::make_shared( + file, std::ios_base::out | std::ios_base::in | std::ios_base::trunc); + }); + return client_->GetObjectByUrl(request); } -PutObjectOutcome OssClient::PutObjectByUrl(const PutObjectByUrlRequest &request) const -{ - return client_->PutObjectByUrl(request); +PutObjectOutcome +OssClient::PutObjectByUrl(const PutObjectByUrlRequest &request) const { + return client_->PutObjectByUrl(request); } -PutObjectOutcome OssClient::PutObjectByUrl(const std::string &url, const std::string &file) const -{ - std::shared_ptr content = std::make_shared(file, std::ios::in|std::ios::binary); - return client_->PutObjectByUrl(PutObjectByUrlRequest(url, content)); +PutObjectOutcome OssClient::PutObjectByUrl(const std::string &url, + const std::string &file) const { + std::shared_ptr content = + std::make_shared(file, std::ios::in | std::ios::binary); + return client_->PutObjectByUrl(PutObjectByUrlRequest(url, content)); } -PutObjectOutcome OssClient::PutObjectByUrl(const std::string &url, const std::string &file, const ObjectMetaData &metaData) const -{ - std::shared_ptr content = std::make_shared(file, std::ios::in | std::ios::binary); - return client_->PutObjectByUrl(PutObjectByUrlRequest(url, content, metaData)); +PutObjectOutcome +OssClient::PutObjectByUrl(const std::string &url, const std::string &file, + const ObjectMetaData &metaData) const { + std::shared_ptr content = + std::make_shared(file, std::ios::in | std::ios::binary); + return client_->PutObjectByUrl(PutObjectByUrlRequest(url, content, metaData)); } -PutObjectOutcome OssClient::PutObjectByUrl(const std::string &url, const std::shared_ptr &content) const -{ - return client_->PutObjectByUrl(PutObjectByUrlRequest(url, content)); +PutObjectOutcome +OssClient::PutObjectByUrl(const std::string &url, + const std::shared_ptr &content) const { + return client_->PutObjectByUrl(PutObjectByUrlRequest(url, content)); } -PutObjectOutcome OssClient::PutObjectByUrl(const std::string &url, const std::shared_ptr &content, const ObjectMetaData &metaData) const -{ - return client_->PutObjectByUrl(PutObjectByUrlRequest(url, content, metaData)); +PutObjectOutcome +OssClient::PutObjectByUrl(const std::string &url, + const std::shared_ptr &content, + const ObjectMetaData &metaData) const { + return client_->PutObjectByUrl(PutObjectByUrlRequest(url, content, metaData)); } -InitiateMultipartUploadOutcome OssClient::InitiateMultipartUpload(const InitiateMultipartUploadRequest &request)const -{ - return client_->InitiateMultipartUpload(request); +InitiateMultipartUploadOutcome OssClient::InitiateMultipartUpload( + const InitiateMultipartUploadRequest &request) const { + return client_->InitiateMultipartUpload(request); } -PutObjectOutcome OssClient::UploadPart(const UploadPartRequest &request) const -{ - return client_->UploadPart(request); +PutObjectOutcome OssClient::UploadPart(const UploadPartRequest &request) const { + return client_->UploadPart(request); } -UploadPartCopyOutcome OssClient::UploadPartCopy(const UploadPartCopyRequest &request) const -{ - return client_->UploadPartCopy(request); +UploadPartCopyOutcome +OssClient::UploadPartCopy(const UploadPartCopyRequest &request) const { + return client_->UploadPartCopy(request); } -CompleteMultipartUploadOutcome OssClient::CompleteMultipartUpload(const CompleteMultipartUploadRequest &request) const -{ - return client_->CompleteMultipartUpload(request); +CompleteMultipartUploadOutcome OssClient::CompleteMultipartUpload( + const CompleteMultipartUploadRequest &request) const { + return client_->CompleteMultipartUpload(request); } -VoidOutcome OssClient::AbortMultipartUpload(const AbortMultipartUploadRequest &request) const -{ - return client_->AbortMultipartUpload(request); +VoidOutcome OssClient::AbortMultipartUpload( + const AbortMultipartUploadRequest &request) const { + return client_->AbortMultipartUpload(request); } -ListMultipartUploadsOutcome OssClient::ListMultipartUploads(const ListMultipartUploadsRequest &request) const -{ - return client_->ListMultipartUploads(request); +ListMultipartUploadsOutcome OssClient::ListMultipartUploads( + const ListMultipartUploadsRequest &request) const { + return client_->ListMultipartUploads(request); } -ListPartsOutcome OssClient::ListParts(const ListPartsRequest &request) const -{ - return client_->ListParts(request); +ListPartsOutcome OssClient::ListParts(const ListPartsRequest &request) const { + return client_->ListParts(request); } /*Aysnc APIs*/ -void OssClient::ListObjectsAsync(const ListObjectsRequest &request, const ListObjectAsyncHandler &handler, const std::shared_ptr& context) const -{ - auto fn = [this, request, handler, context]() - { - handler(this, request, client_->ListObjects(request), context); - }; +void OssClient::ListObjectsAsync( + const ListObjectsRequest &request, const ListObjectAsyncHandler &handler, + const std::shared_ptr &context) const { + auto fn = [this, request, handler, context]() { + handler(this, request, client_->ListObjects(request), context); + }; - client_->asyncExecute(new Runnable(fn)); + client_->asyncExecute(new Runnable(fn)); } -void OssClient::GetObjectAsync(const GetObjectRequest &request, const GetObjectAsyncHandler &handler, const std::shared_ptr& context) const -{ - auto fn = [this, request, handler, context]() - { - handler(this, request, client_->GetObject(request), context); - }; +void OssClient::GetObjectAsync( + const GetObjectRequest &request, const GetObjectAsyncHandler &handler, + const std::shared_ptr &context) const { + auto fn = [this, request, handler, context]() { + handler(this, request, client_->GetObject(request), context); + }; - client_->asyncExecute(new Runnable(fn)); + client_->asyncExecute(new Runnable(fn)); } -void OssClient::PutObjectAsync(const PutObjectRequest &request, const PutObjectAsyncHandler &handler, const std::shared_ptr& context) const -{ - auto fn = [this, request, handler, context]() - { - handler(this, request, client_->PutObject(request), context); - }; +void OssClient::PutObjectAsync( + const PutObjectRequest &request, const PutObjectAsyncHandler &handler, + const std::shared_ptr &context) const { + auto fn = [this, request, handler, context]() { + handler(this, request, client_->PutObject(request), context); + }; - client_->asyncExecute(new Runnable(fn)); + client_->asyncExecute(new Runnable(fn)); } -void OssClient::UploadPartAsync(const UploadPartRequest &request, const UploadPartAsyncHandler &handler, const std::shared_ptr& context) const -{ - auto fn = [this, request, handler, context]() - { - handler(this, request, client_->UploadPart(request), context); - }; +void OssClient::UploadPartAsync( + const UploadPartRequest &request, const UploadPartAsyncHandler &handler, + const std::shared_ptr &context) const { + auto fn = [this, request, handler, context]() { + handler(this, request, client_->UploadPart(request), context); + }; - client_->asyncExecute(new Runnable(fn)); + client_->asyncExecute(new Runnable(fn)); } -void OssClient::UploadPartCopyAsync(const UploadPartCopyRequest &request, const UploadPartCopyAsyncHandler &handler, const std::shared_ptr& context) const -{ - auto fn = [this, request, handler, context]() - { - handler(this, request, client_->UploadPartCopy(request), context); - }; +void OssClient::UploadPartCopyAsync( + const UploadPartCopyRequest &request, + const UploadPartCopyAsyncHandler &handler, + const std::shared_ptr &context) const { + auto fn = [this, request, handler, context]() { + handler(this, request, client_->UploadPartCopy(request), context); + }; - client_->asyncExecute(new Runnable(fn)); + client_->asyncExecute(new Runnable(fn)); } - /*Callable APIs*/ -ListObjectOutcomeCallable OssClient::ListObjectsCallable(const ListObjectsRequest &request) const -{ - auto task = std::make_shared>( - [this, request]() - { - return this->ListObjects(request); - }); - client_->asyncExecute(new Runnable([task]() { (*task)(); })); - return task->get_future(); -} - -GetObjectOutcomeCallable OssClient::GetObjectCallable(const GetObjectRequest &request) const -{ - auto task = std::make_shared>( - [this, request]() - { - return this->GetObject(request); - }); - client_->asyncExecute(new Runnable([task]() { (*task)(); })); - return task->get_future(); - -} - -PutObjectOutcomeCallable OssClient::PutObjectCallable(const PutObjectRequest &request) const -{ - auto task = std::make_shared>( - [this, request]() - { - return this->PutObject(request); - }); - client_->asyncExecute(new Runnable([task]() { (*task)(); })); - return task->get_future(); -} - -PutObjectOutcomeCallable OssClient::UploadPartCallable(const UploadPartRequest &request) const -{ - auto task = std::make_shared>( - [this, request]() - { - return this->UploadPart(request); - }); - client_->asyncExecute(new Runnable([task]() { (*task)(); })); - return task->get_future(); -} - -UploadPartCopyOutcomeCallable OssClient::UploadPartCopyCallable(const UploadPartCopyRequest &request) const -{ - auto task = std::make_shared>( - [this, request]() - { - return this->UploadPartCopy(request); - }); - client_->asyncExecute(new Runnable([task]() { (*task)(); })); - return task->get_future(); +ListObjectOutcomeCallable +OssClient::ListObjectsCallable(const ListObjectsRequest &request) const { + auto task = std::make_shared>( + [this, request]() { return this->ListObjects(request); }); + client_->asyncExecute(new Runnable([task]() { (*task)(); })); + return task->get_future(); +} + +GetObjectOutcomeCallable +OssClient::GetObjectCallable(const GetObjectRequest &request) const { + auto task = std::make_shared>( + [this, request]() { return this->GetObject(request); }); + client_->asyncExecute(new Runnable([task]() { (*task)(); })); + return task->get_future(); +} + +PutObjectOutcomeCallable +OssClient::PutObjectCallable(const PutObjectRequest &request) const { + auto task = std::make_shared>( + [this, request]() { return this->PutObject(request); }); + client_->asyncExecute(new Runnable([task]() { (*task)(); })); + return task->get_future(); +} + +PutObjectOutcomeCallable +OssClient::UploadPartCallable(const UploadPartRequest &request) const { + auto task = std::make_shared>( + [this, request]() { return this->UploadPart(request); }); + client_->asyncExecute(new Runnable([task]() { (*task)(); })); + return task->get_future(); +} + +UploadPartCopyOutcomeCallable +OssClient::UploadPartCopyCallable(const UploadPartCopyRequest &request) const { + auto task = std::make_shared>( + [this, request]() { return this->UploadPartCopy(request); }); + client_->asyncExecute(new Runnable([task]() { (*task)(); })); + return task->get_future(); } /*Extended APIs*/ #if !defined(OSS_DISABLE_BUCKET) -bool OssClient::DoesBucketExist(const std::string &bucket) const -{ - return client_->GetBucketAcl(GetBucketAclRequest(bucket)).isSuccess(); +bool OssClient::DoesBucketExist(const std::string &bucket) const { + return client_->GetBucketAcl(GetBucketAclRequest(bucket)).isSuccess(); } #endif -bool OssClient::DoesObjectExist(const std::string &bucket, const std::string &key) const -{ - return client_->GetObjectMeta(GetObjectMetaRequest(bucket, key)).isSuccess(); +bool OssClient::DoesObjectExist(const std::string &bucket, + const std::string &key) const { + return client_->GetObjectMeta(GetObjectMetaRequest(bucket, key)).isSuccess(); } -CopyObjectOutcome OssClient::ModifyObjectMeta(const std::string& bucket, const std::string& key, const ObjectMetaData& meta) -{ - CopyObjectRequest copyRequest(bucket, key, meta); - copyRequest.setCopySource(bucket, key); - copyRequest.setMetadataDirective(CopyActionList::Replace); - return client_->CopyObject(copyRequest); +CopyObjectOutcome OssClient::ModifyObjectMeta(const std::string &bucket, + const std::string &key, + const ObjectMetaData &meta) { + CopyObjectRequest copyRequest(bucket, key, meta); + copyRequest.setCopySource(bucket, key); + copyRequest.setMetadataDirective(CopyActionList::Replace); + return client_->CopyObject(copyRequest); } #if !defined(OSS_DISABLE_LIVECHANNEL) -VoidOutcome OssClient::PutLiveChannelStatus(const PutLiveChannelStatusRequest &request) const -{ - return client_->PutLiveChannelStatus(request); +VoidOutcome OssClient::PutLiveChannelStatus( + const PutLiveChannelStatusRequest &request) const { + return client_->PutLiveChannelStatus(request); } -PutLiveChannelOutcome OssClient::PutLiveChannel(const PutLiveChannelRequest &request) const -{ - return client_->PutLiveChannel(request); +PutLiveChannelOutcome +OssClient::PutLiveChannel(const PutLiveChannelRequest &request) const { + return client_->PutLiveChannel(request); } -VoidOutcome OssClient::PostVodPlaylist(const PostVodPlaylistRequest &request) const -{ - return client_->PostVodPlaylist(request); +VoidOutcome +OssClient::PostVodPlaylist(const PostVodPlaylistRequest &request) const { + return client_->PostVodPlaylist(request); } -GetVodPlaylistOutcome OssClient::GetVodPlaylist(const GetVodPlaylistRequest &request) const -{ - return client_->GetVodPlaylist(request); +GetVodPlaylistOutcome +OssClient::GetVodPlaylist(const GetVodPlaylistRequest &request) const { + return client_->GetVodPlaylist(request); } -GetLiveChannelStatOutcome OssClient::GetLiveChannelStat(const GetLiveChannelStatRequest &request) const -{ - return client_->GetLiveChannelStat(request); +GetLiveChannelStatOutcome +OssClient::GetLiveChannelStat(const GetLiveChannelStatRequest &request) const { + return client_->GetLiveChannelStat(request); } -GetLiveChannelInfoOutcome OssClient::GetLiveChannelInfo(const GetLiveChannelInfoRequest &request) const -{ - return client_->GetLiveChannelInfo(request); +GetLiveChannelInfoOutcome +OssClient::GetLiveChannelInfo(const GetLiveChannelInfoRequest &request) const { + return client_->GetLiveChannelInfo(request); } -GetLiveChannelHistoryOutcome OssClient::GetLiveChannelHistory(const GetLiveChannelHistoryRequest &request) const -{ - return client_->GetLiveChannelHistory(request); +GetLiveChannelHistoryOutcome OssClient::GetLiveChannelHistory( + const GetLiveChannelHistoryRequest &request) const { + return client_->GetLiveChannelHistory(request); } -ListLiveChannelOutcome OssClient::ListLiveChannel(const ListLiveChannelRequest &request) const -{ - return client_->ListLiveChannel(request); +ListLiveChannelOutcome +OssClient::ListLiveChannel(const ListLiveChannelRequest &request) const { + return client_->ListLiveChannel(request); } -VoidOutcome OssClient::DeleteLiveChannel(const DeleteLiveChannelRequest &request) const -{ - return client_->DeleteLiveChannel(request); +VoidOutcome +OssClient::DeleteLiveChannel(const DeleteLiveChannelRequest &request) const { + return client_->DeleteLiveChannel(request); } -StringOutcome OssClient::GenerateRTMPSignedUrl(const GenerateRTMPSignedUrlRequest &request) const -{ - return client_->GenerateRTMPSignedUrl(request); +StringOutcome OssClient::GenerateRTMPSignedUrl( + const GenerateRTMPSignedUrlRequest &request) const { + return client_->GenerateRTMPSignedUrl(request); } #endif -void OssClient::DisableRequest() -{ - client_->DisableRequest(); -} +void OssClient::DisableRequest() { client_->DisableRequest(); } -void OssClient::EnableRequest() -{ - client_->EnableRequest(); -} +void OssClient::EnableRequest() { client_->EnableRequest(); } #if !defined(OSS_DISABLE_RESUAMABLE) -PutObjectOutcome OssClient::ResumableUploadObject(const UploadObjectRequest &request) const -{ - return client_->ResumableUploadObject(request); +PutObjectOutcome +OssClient::ResumableUploadObject(const UploadObjectRequest &request) const { + return client_->ResumableUploadObject(request); } -CopyObjectOutcome OssClient::ResumableCopyObject(const MultiCopyObjectRequest &request) const -{ - return client_->ResumableCopyObject(request); +CopyObjectOutcome +OssClient::ResumableCopyObject(const MultiCopyObjectRequest &request) const { + return client_->ResumableCopyObject(request); } -GetObjectOutcome OssClient::ResumableDownloadObject(const DownloadObjectRequest &request) const -{ - return client_->ResumableDownloadObject(request); +GetObjectOutcome +OssClient::ResumableDownloadObject(const DownloadObjectRequest &request) const { + return client_->ResumableDownloadObject(request); } #endif \ No newline at end of file diff --git a/sdk/src/OssClientImpl.cc b/sdk/src/OssClientImpl.cc index ee38619..4ef75d4 100644 --- a/sdk/src/OssClientImpl.cc +++ b/sdk/src/OssClientImpl.cc @@ -1,1773 +1,1839 @@ /* -* Copyright 2009-2017 Alibaba Cloud All rights reserved. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2009-2017 Alibaba Cloud All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ -#include +#include "OssClientImpl.h" +#include "auth/HmacSha1Signer.h" +#include "utils/FileSystemUtils.h" +#include "utils/LogUtils.h" +#include "utils/SignUtils.h" +#include "utils/ThreadExecutor.h" +#include "utils/Utils.h" #include -#include -#include -#include -#include #include +#include +#include #include -#include "utils/Utils.h" -#include "utils/SignUtils.h" -#include "utils/ThreadExecutor.h" -#include "auth/HmacSha1Signer.h" -#include "OssClientImpl.h" -#include "utils/LogUtils.h" -#include "utils/FileSystemUtils.h" +#include +#include +#include + #if !defined(OSS_DISABLE_RESUAMABLE) -#include "resumable/ResumableUploader.h" -#include "resumable/ResumableDownloader.h" #include "resumable/ResumableCopier.h" +#include "resumable/ResumableDownloader.h" +#include "resumable/ResumableUploader.h" + #endif using namespace AlibabaCloud::OSS; using namespace tinyxml2; -namespace -{ +namespace { const std::string SERVICE_NAME = "OSS"; const char *TAG = "OssClientImpl"; -} - -OssClientImpl::OssClientImpl(const std::string &endpoint, const std::shared_ptr& credentialsProvider, const ClientConfiguration & configuration) : - Client(SERVICE_NAME, configuration), - endpoint_(endpoint), - credentialsProvider_(credentialsProvider), - signer_(std::make_shared()), - executor_(configuration.executor ? configuration.executor :std::make_shared()), - isValidEndpoint_(IsValidEndpoint(endpoint)) -{ -} - -OssClientImpl::~OssClientImpl() -{ -} - -int OssClientImpl::asyncExecute(Runnable * r) const -{ - if (executor_ == nullptr) - return 1; - - executor_->execute(r); - return 0; -} - -std::shared_ptr OssClientImpl::buildHttpRequest(const std::string & endpoint, const ServiceRequest & msg, Http::Method method) const -{ - auto httpRequest = std::make_shared(method); - auto calcContentMD5 = !!(msg.Flags()&REQUEST_FLAG_CONTENTMD5); - auto paramInPath = !!(msg.Flags()&REQUEST_FLAG_PARAM_IN_PATH); - httpRequest->setResponseStreamFactory(msg.ResponseStreamFactory()); - addHeaders(httpRequest, msg.Headers()); - addBody(httpRequest, msg.Body(), calcContentMD5); - if (paramInPath) { - httpRequest->setUrl(Url(msg.Path())); - } - else { - addSignInfo(httpRequest, msg); - addUrl(httpRequest, endpoint, msg); - } - addOther(httpRequest, msg); - return httpRequest; -} - -bool OssClientImpl::hasResponseError(const std::shared_ptr&response) const -{ - if (BASE::hasResponseError(response)) { - return true; - } - - //check crc64 - if (response->request().hasCheckCrc64() && - !response->request().hasHeader(Http::RANGE) && - response->hasHeader("x-oss-hash-crc64ecma")) { - uint64_t clientCrc64 = response->request().Crc64Result(); - uint64_t serverCrc64 = std::strtoull(response->Header("x-oss-hash-crc64ecma").c_str(), nullptr, 10); - if (clientCrc64 != serverCrc64) { - response->setStatusCode(ERROR_CRC_INCONSISTENT); - std::stringstream ss; - ss << "Crc64 validation failed. Expected hash:" << serverCrc64 - << " not equal to calculated hash:" << clientCrc64 - << ". Transferd bytes:" << response->request().TransferedBytes() - << ". RequestId:" << response->Header("x-oss-request-id").c_str(); - response->setStatusMsg(ss.str().c_str()); - return true; - } - } - - //check Calback - if (response->statusCode() == 203 && - (response->request().hasHeader("x-oss-callback") || - (response->request().url().query().find("callback=") != std::string::npos))) { - return true; - } - - return false; -} - -void OssClientImpl::addHeaders(const std::shared_ptr &httpRequest, const HeaderCollection &headers) const -{ - for (auto const& header : headers) { - httpRequest->addHeader(header.first, header.second); - } - - //common headers - httpRequest->addHeader(Http::USER_AGENT, configuration().userAgent); - - //Date - if (httpRequest->hasHeader("x-oss-date")) { - httpRequest->addHeader(Http::DATE, httpRequest->Header("x-oss-date")); - } - if (!httpRequest->hasHeader(Http::DATE)) { - std::time_t t = std::time(nullptr); - t += getRequestDateOffset(); - httpRequest->addHeader(Http::DATE, ToGmtTime(t)); +} // namespace + +OssClientImpl::OssClientImpl( + const std::string &endpoint, + const std::shared_ptr &credentialsProvider, + const ClientConfiguration &configuration) + : Client(SERVICE_NAME, configuration), endpoint_(endpoint), + credentialsProvider_(credentialsProvider), + signer_(std::make_shared()), + executor_(configuration.executor ? configuration.executor + : std::make_shared()), + isValidEndpoint_(IsValidEndpoint(endpoint)) {} + +OssClientImpl::~OssClientImpl() {} + +int OssClientImpl::asyncExecute(Runnable *r) const { + if (executor_ == nullptr) + return 1; + + executor_->execute(r); + return 0; +} + +std::shared_ptr +OssClientImpl::buildHttpRequest(const std::string &endpoint, + const ServiceRequest &msg, + Http::Method method) const { + auto httpRequest = std::make_shared(method); + auto calcContentMD5 = !!(msg.Flags() & REQUEST_FLAG_CONTENTMD5); + auto paramInPath = !!(msg.Flags() & REQUEST_FLAG_PARAM_IN_PATH); + httpRequest->setResponseStreamFactory(msg.ResponseStreamFactory()); + addHeaders(httpRequest, msg.Headers()); + addBody(httpRequest, msg.Body(), calcContentMD5); + if (paramInPath) { + httpRequest->setUrl(Url(msg.Path())); + } else { + addSignInfo(httpRequest, msg); + addUrl(httpRequest, endpoint, msg); + } + addOther(httpRequest, msg); + return httpRequest; +} + +bool OssClientImpl::hasResponseError( + const std::shared_ptr &response) const { + if (BASE::hasResponseError(response)) { + return true; + } + + // check crc64 + if (response->request().hasCheckCrc64() && + !response->request().hasHeader(Http::RANGE) && + response->hasHeader("x-oss-hash-crc64ecma")) { + uint64_t clientCrc64 = response->request().Crc64Result(); + uint64_t serverCrc64 = std::strtoull( + response->Header("x-oss-hash-crc64ecma").c_str(), nullptr, 10); + if (clientCrc64 != serverCrc64) { + response->setStatusCode(ERROR_CRC_INCONSISTENT); + std::stringstream ss; + ss << "Crc64 validation failed. Expected hash:" << serverCrc64 + << " not equal to calculated hash:" << clientCrc64 + << ". Transferd bytes:" << response->request().TransferedBytes() + << ". RequestId:" << response->Header("x-oss-request-id").c_str(); + response->setStatusMsg(ss.str().c_str()); + return true; + } + } + + // check Calback + if (response->statusCode() == 203 && + (response->request().hasHeader("x-oss-callback") || + (response->request().url().query().find("callback=") != + std::string::npos))) { + return true; + } + + return false; +} + +void OssClientImpl::addHeaders(const std::shared_ptr &httpRequest, + const HeaderCollection &headers) const { + for (auto const &header : headers) { + httpRequest->addHeader(header.first, header.second); + } + + // common headers + httpRequest->addHeader(Http::USER_AGENT, configuration().userAgent); + + // Date + if (httpRequest->hasHeader("x-oss-date")) { + httpRequest->addHeader(Http::DATE, httpRequest->Header("x-oss-date")); + } + if (!httpRequest->hasHeader(Http::DATE)) { + std::time_t t = std::time(nullptr); + t += getRequestDateOffset(); + httpRequest->addHeader(Http::DATE, ToGmtTime(t)); + } +} + +void OssClientImpl::addBody(const std::shared_ptr &httpRequest, + const std::shared_ptr &body, + bool contentMd5) const { + if (body == nullptr) { + Http::Method methold = httpRequest->method(); + if (methold == Http::Method::Get || methold == Http::Method::Post) { + httpRequest->setHeader(Http::CONTENT_LENGTH, "0"); + } else { + httpRequest->removeHeader(Http::CONTENT_LENGTH); } -} + } -void OssClientImpl::addBody(const std::shared_ptr &httpRequest, const std::shared_ptr& body, bool contentMd5) const -{ - if (body == nullptr) { - Http::Method methold = httpRequest->method(); - if (methold == Http::Method::Get || methold == Http::Method::Post) { - httpRequest->setHeader(Http::CONTENT_LENGTH, "0"); - } else { - httpRequest->removeHeader(Http::CONTENT_LENGTH); - } - } - - if ((body != nullptr) && !httpRequest->hasHeader(Http::CONTENT_LENGTH)) { - auto streamSize = GetIOStreamLength(*body); - httpRequest->setHeader(Http::CONTENT_LENGTH, std::to_string(streamSize)); - } + if ((body != nullptr) && !httpRequest->hasHeader(Http::CONTENT_LENGTH)) { + auto streamSize = GetIOStreamLength(*body); + httpRequest->setHeader(Http::CONTENT_LENGTH, std::to_string(streamSize)); + } - if (contentMd5 && body && !httpRequest->hasHeader(Http::CONTENT_MD5)) { - auto md5 = ComputeContentMD5(*body); - httpRequest->setHeader(Http::CONTENT_MD5, md5); - } + if (contentMd5 && body && !httpRequest->hasHeader(Http::CONTENT_MD5)) { + auto md5 = ComputeContentMD5(*body); + httpRequest->setHeader(Http::CONTENT_MD5, md5); + } - httpRequest->addBody(body); + httpRequest->addBody(body); } -void OssClientImpl::addSignInfo(const std::shared_ptr &httpRequest, const ServiceRequest &request) const -{ - const Credentials credentials = credentialsProvider_->getCredentials(); - if (!credentials.SessionToken().empty()) { - httpRequest->addHeader("x-oss-security-token", credentials.SessionToken()); - } +void OssClientImpl::addSignInfo(const std::shared_ptr &httpRequest, + const ServiceRequest &request) const { + const Credentials credentials = credentialsProvider_->getCredentials(); + if (!credentials.SessionToken().empty()) { + httpRequest->addHeader("x-oss-security-token", credentials.SessionToken()); + } - //Sort the parameters - ParameterCollection parameters; - for (auto const¶m : request.Parameters()) { - parameters[param.first] = param.second; - } + // Sort the parameters + ParameterCollection parameters; + for (auto const ¶m : request.Parameters()) { + parameters[param.first] = param.second; + } - std::string method = Http::MethodToString(httpRequest->method()); + std::string method = Http::MethodToString(httpRequest->method()); - const OssRequest& ossRequest = static_cast(request); - std::string resource; + const OssRequest &ossRequest = static_cast(request); + std::string resource; + resource.append("/"); + if (!ossRequest.bucket().empty()) { + resource.append(ossRequest.bucket()); resource.append("/"); - if (!ossRequest.bucket().empty()) { - resource.append(ossRequest.bucket()); - resource.append("/"); - } - if (!ossRequest.key().empty()) { - resource.append(ossRequest.key()); - } + } + if (!ossRequest.key().empty()) { + resource.append(ossRequest.key()); + } - std::string date = httpRequest->Header(Http::DATE); + std::string date = httpRequest->Header(Http::DATE); - SignUtils signUtils(signer_->version()); - signUtils.build(method, resource, date, httpRequest->Headers(), parameters); - auto signature = signer_->generate(signUtils.CanonicalString(), credentials.AccessKeySecret()); + SignUtils signUtils(signer_->version()); + signUtils.build(method, resource, date, httpRequest->Headers(), parameters); + auto signature = signer_->generate(signUtils.CanonicalString(), + credentials.AccessKeySecret()); - std::stringstream authValue; - authValue - << "OSS " - << credentials.AccessKeyId() - << ":" - << signature; + std::stringstream authValue; + authValue << "OSS " << credentials.AccessKeyId() << ":" << signature; - httpRequest->addHeader(Http::AUTHORIZATION, authValue.str()); + httpRequest->addHeader(Http::AUTHORIZATION, authValue.str()); - OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) request(%p) CanonicalString:%s", this, httpRequest.get(), signUtils.CanonicalString().c_str()); - OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) request(%p) Authorization:%s", this, httpRequest.get(), authValue.str().c_str()); + OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) request(%p) CanonicalString:%s", + this, httpRequest.get(), signUtils.CanonicalString().c_str()); + OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) request(%p) Authorization:%s", + this, httpRequest.get(), authValue.str().c_str()); } -void OssClientImpl::addUrl(const std::shared_ptr &httpRequest, const std::string &endpoint, const ServiceRequest &request) const -{ - const OssRequest& ossRequest = static_cast(request); - - auto host = CombineHostString(endpoint, ossRequest.bucket(), configuration().isCname, configuration().isPathStyle); - auto path = CombinePathString(endpoint, ossRequest.bucket(), ossRequest.key(), configuration().isPathStyle); +void OssClientImpl::addUrl(const std::shared_ptr &httpRequest, + const std::string &endpoint, + const ServiceRequest &request) const { + const OssRequest &ossRequest = static_cast(request); - Url url(host); - url.setPath(path); + auto host = + CombineHostString(endpoint, ossRequest.bucket(), configuration().isCname, + configuration().isPathStyle); + auto path = CombinePathString(endpoint, ossRequest.bucket(), ossRequest.key(), + configuration().isPathStyle); - OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) request(%p) host:%s, path:%s", this, httpRequest.get(), host.c_str(), path.c_str()); - - auto parameters = request.Parameters(); - if (!parameters.empty()) { - std::stringstream queryString; - for (const auto &p : parameters) - { - if (p.second.empty()) - queryString << "&" << UrlEncode(p.first); - else - queryString << "&" << UrlEncode(p.first) << "=" << UrlEncode(p.second); - } - url.setQuery(queryString.str().substr(1)); - } - httpRequest->setUrl(url); -} + Url url(host); + url.setPath(path); -void OssClientImpl::addOther(const std::shared_ptr &httpRequest, const ServiceRequest &request) const -{ - //progress - httpRequest->setTransferProgress(request.TransferProgress()); + OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) request(%p) host:%s, path:%s", + this, httpRequest.get(), host.c_str(), path.c_str()); - //crc64 check - auto checkCRC64 = !!(request.Flags()&REQUEST_FLAG_CHECK_CRC64); - if (configuration().enableCrc64 && checkCRC64 ) { - httpRequest->setCheckCrc64(true); -#ifdef ENABLE_OSS_TEST - if (!!(request.Flags()&0x80000000)) { - httpRequest->addHeader("oss-test-crc64", "1"); - } -#endif + auto parameters = request.Parameters(); + if (!parameters.empty()) { + std::stringstream queryString; + for (const auto &p : parameters) { + if (p.second.empty()) + queryString << "&" << UrlEncode(p.first); + else + queryString << "&" << UrlEncode(p.first) << "=" << UrlEncode(p.second); } + url.setQuery(queryString.str().substr(1)); + } + httpRequest->setUrl(url); } -OssError OssClientImpl::buildError(const Error &error) const -{ - OssError err; - if (((error.Status() == 203) || (error.Status() > 299 && error.Status() < 600)) && - !error.Message().empty()) { - XMLDocument doc; - XMLError xml_err; - if ((xml_err = doc.Parse(error.Message().c_str(), error.Message().size())) == XML_SUCCESS) { - XMLElement* root =doc.RootElement(); - if (root && !std::strncmp("Error", root->Name(), 5)) { - XMLElement *node; - node = root->FirstChildElement("Code"); - err.setCode(node ? node->GetText(): ""); - node = root->FirstChildElement("Message"); - err.setMessage(node ? node->GetText(): ""); - node = root->FirstChildElement("RequestId"); - err.setRequestId(node ? node->GetText(): ""); - node = root->FirstChildElement("HostId"); - err.setHost(node ? node->GetText(): ""); - } else { - err.setCode("ParseXMLError"); - err.setMessage("Xml format invalid, root node name is not Error. the content is:\n" + error.Message()); - } - } else { - std::stringstream ss; - ss << "ParseXMLError:" << xml_err; - err.setCode(ss.str()); - err.setMessage(XMLDocument::ErrorIDToName(xml_err)); - } - } - else { - err.setCode(error.Code()); - err.setMessage(error.Message()); - } - - //get from header if body has nothing - if (err.RequestId().empty()) { - auto it = error.Headers().find("x-oss-request-id"); - if (it != error.Headers().end()) { - err.setRequestId(it->second); - } - } - - return err; -} +void OssClientImpl::addOther(const std::shared_ptr &httpRequest, + const ServiceRequest &request) const { + // progress + httpRequest->setTransferProgress(request.TransferProgress()); -ServiceResult OssClientImpl::buildResult(const OssRequest &request, const std::shared_ptr &httpResponse) const -{ - ServiceResult result; - auto flag = request.Flags(); - if ((flag & REQUEST_FLAG_CHECK_CRC64) && - (flag & REQUEST_FLAG_SAVE_CLIENT_CRC64)) { - httpResponse->addHeader("x-oss-hash-crc64ecma-by-client", std::to_string(httpResponse->request().Crc64Result())); - } - result.setRequestId(httpResponse->Header("x-oss-request-id")); - result.setPlayload(httpResponse->Body()); - result.setResponseCode(httpResponse->statusCode()); - result.setHeaderCollection(httpResponse->Headers()); - return result; -} - -OssOutcome OssClientImpl::MakeRequest(const OssRequest &request, Http::Method method) const -{ - int ret = request.validate(); - if (ret != 0) { - return OssOutcome(OssError("ValidateError", request.validateMessage(ret))); - } - - if (!isValidEndpoint_) { - return OssOutcome(OssError("ValidateError", "The endpoint is invalid.")); + // crc64 check + auto checkCRC64 = !!(request.Flags() & REQUEST_FLAG_CHECK_CRC64); + if (configuration().enableCrc64 && checkCRC64) { + httpRequest->setCheckCrc64(true); +#ifdef ENABLE_OSS_TEST + if (!!(request.Flags() & 0x80000000)) { + httpRequest->addHeader("oss-test-crc64", "1"); } - - auto outcome = BASE::AttemptRequest(endpoint_, request, method); - if (outcome.isSuccess()) { - return OssOutcome(buildResult(request, outcome.result())); +#endif + } +} + +OssError OssClientImpl::buildError(const Error &error) const { + OssError err; + if (((error.Status() == 203) || + (error.Status() > 299 && error.Status() < 600)) && + !error.Message().empty()) { + XMLDocument doc; + XMLError xml_err; + if ((xml_err = doc.Parse(error.Message().c_str(), + error.Message().size())) == XML_SUCCESS) { + XMLElement *root = doc.RootElement(); + if (root && !std::strncmp("Error", root->Name(), 5)) { + XMLElement *node; + node = root->FirstChildElement("Code"); + err.setCode(node ? node->GetText() : ""); + node = root->FirstChildElement("Message"); + err.setMessage(node ? node->GetText() : ""); + node = root->FirstChildElement("RequestId"); + err.setRequestId(node ? node->GetText() : ""); + node = root->FirstChildElement("HostId"); + err.setHost(node ? node->GetText() : ""); + } else { + err.setCode("ParseXMLError"); + err.setMessage("Xml format invalid, root node name is not Error. the " + "content is:\n" + + error.Message()); + } } else { - return OssOutcome(buildError(outcome.error())); - } + std::stringstream ss; + ss << "ParseXMLError:" << xml_err; + err.setCode(ss.str()); + err.setMessage(XMLDocument::ErrorIDToName(xml_err)); + } + } else { + err.setCode(error.Code()); + err.setMessage(error.Message()); + } + + // get from header if body has nothing + if (err.RequestId().empty()) { + auto it = error.Headers().find("x-oss-request-id"); + if (it != error.Headers().end()) { + err.setRequestId(it->second); + } + } + + return err; +} + +ServiceResult OssClientImpl::buildResult( + const OssRequest &request, + const std::shared_ptr &httpResponse) const { + ServiceResult result; + auto flag = request.Flags(); + if ((flag & REQUEST_FLAG_CHECK_CRC64) && + (flag & REQUEST_FLAG_SAVE_CLIENT_CRC64)) { + httpResponse->addHeader( + "x-oss-hash-crc64ecma-by-client", + std::to_string(httpResponse->request().Crc64Result())); + } + result.setRequestId(httpResponse->Header("x-oss-request-id")); + result.setPlayload(httpResponse->Body()); + result.setResponseCode(httpResponse->statusCode()); + result.setHeaderCollection(httpResponse->Headers()); + return result; +} + +OssOutcome OssClientImpl::MakeRequest(const OssRequest &request, + Http::Method method) const { + int ret = request.validate(); + if (ret != 0) { + return OssOutcome(OssError("ValidateError", request.validateMessage(ret))); + } + + if (!isValidEndpoint_) { + return OssOutcome(OssError("ValidateError", "The endpoint is invalid.")); + } + + auto outcome = BASE::AttemptRequest(endpoint_, request, method); + if (outcome.isSuccess()) { + return OssOutcome(buildResult(request, outcome.result())); + } else { + return OssOutcome(buildError(outcome.error())); + } +} + +#ifdef USE_CPP20 +async_simple::coro::Lazy +OssClientImpl::MakeRequestAsync(const OssRequest &request, + Http::Method method) const { + int ret = request.validate(); + if (ret != 0) { + co_return OssOutcome( + OssError("ValidateError", request.validateMessage(ret))); + } + + if (!isValidEndpoint_) { + co_return OssOutcome(OssError("ValidateError", "The endpoint is invalid.")); + } + + auto outcome = co_await BASE::AttemptRequestAsync(endpoint_, request, method); + if (outcome.isSuccess()) { + co_return OssOutcome(buildResult(request, outcome.result())); + } else { + co_return OssOutcome(buildError(outcome.error())); + } } +#endif #if !defined(OSS_DISABLE_BUCKET) -ListBucketsOutcome OssClientImpl::ListBuckets(const ListBucketsRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - ListBucketsResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? ListBucketsOutcome(std::move(result)) : - ListBucketsOutcome(OssError("ParseXMLError", "Parsing ListBuckets result fail.")); - } else { - return ListBucketsOutcome(outcome.error()); - } -} - -CreateBucketOutcome OssClientImpl::CreateBucket(const CreateBucketRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - return CreateBucketOutcome(Bucket()); - } else { - return CreateBucketOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketAcl(const SetBucketAclRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketLogging(const SetBucketLoggingRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketWebsite(const SetBucketWebsiteRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketReferer(const SetBucketRefererRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketLifecycle(const SetBucketLifecycleRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketCors(const SetBucketCorsRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketStorageCapacity(const SetBucketStorageCapacityRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketPolicy(const SetBucketPolicyRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} -VoidOutcome OssClientImpl::SetBucketRequestPayment(const SetBucketRequestPaymentRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome AlibabaCloud::OSS::OssClientImpl::SetBucketEncryption(const SetBucketEncryptionRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketTagging(const SetBucketTaggingRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketQosInfo(const SetBucketQosInfoRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketVersioning(const SetBucketVersioningRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::SetBucketInventoryConfiguration(const SetBucketInventoryConfigurationRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucket(const DeleteBucketRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucketLogging(const DeleteBucketLoggingRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucketWebsite(const DeleteBucketWebsiteRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucketLifecycle(const DeleteBucketLifecycleRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucketCors(const DeleteBucketCorsRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucketPolicy(const DeleteBucketPolicyRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucketEncryption(const DeleteBucketEncryptionRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucketTagging(const DeleteBucketTaggingRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucketQosInfo(const DeleteBucketQosInfoRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteBucketInventoryConfiguration(const DeleteBucketInventoryConfigurationRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -GetBucketAclOutcome OssClientImpl::GetBucketAcl(const GetBucketAclRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketAclResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketAclOutcome(std::move(result)) : - GetBucketAclOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketAclOutcome(outcome.error()); - } -} - -GetBucketLocationOutcome OssClientImpl::GetBucketLocation(const GetBucketLocationRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketLocationResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketLocationOutcome(std::move(result)) : - GetBucketLocationOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketLocationOutcome(outcome.error()); - } -} - -GetBucketInfoOutcome OssClientImpl::GetBucketInfo(const GetBucketInfoRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketInfoResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketInfoOutcome(std::move(result)) : - GetBucketInfoOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketInfoOutcome(outcome.error()); - } -} - -GetBucketLoggingOutcome OssClientImpl::GetBucketLogging(const GetBucketLoggingRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketLoggingResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketLoggingOutcome(std::move(result)) : - GetBucketLoggingOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketLoggingOutcome(outcome.error()); - } -} - -GetBucketWebsiteOutcome OssClientImpl::GetBucketWebsite(const GetBucketWebsiteRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketWebsiteResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketWebsiteOutcome(std::move(result)) : - GetBucketWebsiteOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketWebsiteOutcome(outcome.error()); - } -} - -GetBucketRefererOutcome OssClientImpl::GetBucketReferer(const GetBucketRefererRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketRefererResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketRefererOutcome(std::move(result)) : - GetBucketRefererOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketRefererOutcome(outcome.error()); - } -} - -GetBucketLifecycleOutcome OssClientImpl::GetBucketLifecycle(const GetBucketLifecycleRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketLifecycleResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketLifecycleOutcome(std::move(result)) : - GetBucketLifecycleOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketLifecycleOutcome(outcome.error()); - } -} - -GetBucketStatOutcome OssClientImpl::GetBucketStat(const GetBucketStatRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketStatResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketStatOutcome(std::move(result)) : - GetBucketStatOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketStatOutcome(outcome.error()); - } -} - -GetBucketCorsOutcome OssClientImpl::GetBucketCors(const GetBucketCorsRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketCorsResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketCorsOutcome(std::move(result)) : - GetBucketCorsOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketCorsOutcome(outcome.error()); - } -} - -GetBucketStorageCapacityOutcome OssClientImpl::GetBucketStorageCapacity(const GetBucketStorageCapacityRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketStorageCapacityResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketStorageCapacityOutcome(std::move(result)) : - GetBucketStorageCapacityOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketStorageCapacityOutcome(outcome.error()); - } -} - -GetBucketPolicyOutcome OssClientImpl::GetBucketPolicy(const GetBucketPolicyRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketPolicyResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketPolicyOutcome(std::move(result)) : - GetBucketPolicyOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return GetBucketPolicyOutcome(outcome.error()); - } -} -GetBucketPaymentOutcome OssClientImpl::GetBucketRequestPayment(const GetBucketRequestPaymentRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketPaymentResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketPaymentOutcome(std::move(result)) : - GetBucketPaymentOutcome(OssError("ParseXMLError", "Parsing GetBucketPayment result fail.")); - } - else { - return GetBucketPaymentOutcome(outcome.error()); - } -} - -GetBucketEncryptionOutcome OssClientImpl::GetBucketEncryption(const GetBucketEncryptionRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketEncryptionResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketEncryptionOutcome(std::move(result)) : - GetBucketEncryptionOutcome(OssError("ParseXMLError", "Parsing GetBucketEncryption result fail.")); - } - else { - return GetBucketEncryptionOutcome(outcome.error()); - } -} - -GetBucketTaggingOutcome OssClientImpl::GetBucketTagging(const GetBucketTaggingRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketTaggingResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketTaggingOutcome(std::move(result)) : - GetBucketTaggingOutcome(OssError("ParseXMLError", "Parsing GetBucketTagging result fail.")); - } - else { - return GetBucketTaggingOutcome(outcome.error()); - } -} - -GetBucketQosInfoOutcome OssClientImpl::GetBucketQosInfo(const GetBucketQosInfoRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketQosInfoResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketQosInfoOutcome(std::move(result)) : - GetBucketQosInfoOutcome(OssError("ParseXMLError", "Parsing GetBucketQosInfo result fail.")); - } - else { - return GetBucketQosInfoOutcome(outcome.error()); - } -} - -GetUserQosInfoOutcome OssClientImpl::GetUserQosInfo(const GetUserQosInfoRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetUserQosInfoResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetUserQosInfoOutcome(std::move(result)) : - GetUserQosInfoOutcome(OssError("ParseXMLError", "Parsing GetUserQosInfo result fail.")); - } - else { - return GetUserQosInfoOutcome(outcome.error()); - } -} - -GetBucketVersioningOutcome OssClientImpl::GetBucketVersioning(const GetBucketVersioningRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketVersioningResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketVersioningOutcome(std::move(result)) : - GetBucketVersioningOutcome(OssError("ParseXMLError", "Parsing GetBucketVersioning result fail.")); - } - else { - return GetBucketVersioningOutcome(outcome.error()); - } -} - -GetBucketInventoryConfigurationOutcome OssClientImpl::GetBucketInventoryConfiguration(const GetBucketInventoryConfigurationRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketInventoryConfigurationResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketInventoryConfigurationOutcome(std::move(result)) : - GetBucketInventoryConfigurationOutcome(OssError("ParseXMLError", "Parsing GetBucketInventoryConfiguration result fail.")); - } - else { - return GetBucketInventoryConfigurationOutcome(outcome.error()); - } -} - -ListBucketInventoryConfigurationsOutcome OssClientImpl::ListBucketInventoryConfigurations(const ListBucketInventoryConfigurationsRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - ListBucketInventoryConfigurationsResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? ListBucketInventoryConfigurationsOutcome(std::move(result)) : - ListBucketInventoryConfigurationsOutcome(OssError("ParseXMLError", "Parsing ListBucketInventoryConfigurations result fail.")); - } - else { - return ListBucketInventoryConfigurationsOutcome(outcome.error()); - } -} - -InitiateBucketWormOutcome OssClientImpl::InitiateBucketWorm(const InitiateBucketWormRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - if (outcome.isSuccess()) { - return InitiateBucketWormOutcome(InitiateBucketWormResult(outcome.result().headerCollection())); - } - else { - return InitiateBucketWormOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::AbortBucketWorm(const AbortBucketWormRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::CompleteBucketWorm(const CompleteBucketWormRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::ExtendBucketWormWorm(const ExtendBucketWormRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - if (outcome.isSuccess()) { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } -} - -GetBucketWormOutcome OssClientImpl::GetBucketWorm(const GetBucketWormRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetBucketWormResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? GetBucketWormOutcome(std::move(result)) : - GetBucketWormOutcome(OssError("ParseXMLError", "Parsing GetBucketWorm result fail.")); - } - else { - return GetBucketWormOutcome(outcome.error()); - } +ListBucketsOutcome +OssClientImpl::ListBuckets(const ListBucketsRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + ListBucketsResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? ListBucketsOutcome(std::move(result)) + : ListBucketsOutcome(OssError( + "ParseXMLError", "Parsing ListBuckets result fail.")); + } else { + return ListBucketsOutcome(outcome.error()); + } +} + +CreateBucketOutcome +OssClientImpl::CreateBucket(const CreateBucketRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + return CreateBucketOutcome(Bucket()); + } else { + return CreateBucketOutcome(outcome.error()); + } +} + +#ifdef USE_CPP20 +async_simple::coro::Lazy +OssClientImpl::CreateBucketAsync(const CreateBucketRequest &request) const { + auto outcome = co_await MakeRequestAsync(request, Http::Method::Put); + if (outcome.isSuccess()) { + co_return CreateBucketOutcome(Bucket()); + } else { + co_return CreateBucketOutcome(outcome.error()); + } } #endif -ListObjectOutcome OssClientImpl::ListObjects(const ListObjectsRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - ListObjectsResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? ListObjectOutcome(std::move(result)) : - ListObjectOutcome(OssError("ParseXMLError", "Parsing ListObject result fail.")); - } - else { - return ListObjectOutcome(outcome.error()); - } -} - -ListObjectsV2Outcome OssClientImpl::ListObjectsV2(const ListObjectsV2Request &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - ListObjectsV2Result result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? ListObjectsV2Outcome(std::move(result)) : - ListObjectsV2Outcome(OssError("ParseXMLError", "Parsing ListObjectV2 result fail.")); - } - else { - return ListObjectsV2Outcome(outcome.error()); - } +VoidOutcome +OssClientImpl::SetBucketAcl(const SetBucketAclRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::SetBucketLogging(const SetBucketLoggingRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::SetBucketWebsite(const SetBucketWebsiteRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::SetBucketReferer(const SetBucketRefererRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::SetBucketLifecycle( + const SetBucketLifecycleRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::SetBucketCors(const SetBucketCorsRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::SetBucketStorageCapacity( + const SetBucketStorageCapacityRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::SetBucketPolicy(const SetBucketPolicyRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} +VoidOutcome OssClientImpl::SetBucketRequestPayment( + const SetBucketRequestPaymentRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome AlibabaCloud::OSS::OssClientImpl::SetBucketEncryption( + const SetBucketEncryptionRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::SetBucketTagging(const SetBucketTaggingRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::SetBucketQosInfo(const SetBucketQosInfoRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::SetBucketVersioning( + const SetBucketVersioningRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::SetBucketInventoryConfiguration( + const SetBucketInventoryConfigurationRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::DeleteBucket(const DeleteBucketRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::DeleteBucketLogging( + const DeleteBucketLoggingRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::DeleteBucketWebsite( + const DeleteBucketWebsiteRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::DeleteBucketLifecycle( + const DeleteBucketLifecycleRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::DeleteBucketCors(const DeleteBucketCorsRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::DeleteBucketPolicy( + const DeleteBucketPolicyRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::DeleteBucketEncryption( + const DeleteBucketEncryptionRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::DeleteBucketTagging( + const DeleteBucketTaggingRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::DeleteBucketQosInfo( + const DeleteBucketQosInfoRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::DeleteBucketInventoryConfiguration( + const DeleteBucketInventoryConfigurationRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +GetBucketAclOutcome +OssClientImpl::GetBucketAcl(const GetBucketAclRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketAclResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketAclOutcome(std::move(result)) + : GetBucketAclOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketAclOutcome(outcome.error()); + } +} + +GetBucketLocationOutcome OssClientImpl::GetBucketLocation( + const GetBucketLocationRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketLocationResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketLocationOutcome(std::move(result)) + : GetBucketLocationOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketLocationOutcome(outcome.error()); + } +} + +GetBucketInfoOutcome +OssClientImpl::GetBucketInfo(const GetBucketInfoRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketInfoResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketInfoOutcome(std::move(result)) + : GetBucketInfoOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketInfoOutcome(outcome.error()); + } +} + +GetBucketLoggingOutcome +OssClientImpl::GetBucketLogging(const GetBucketLoggingRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketLoggingResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketLoggingOutcome(std::move(result)) + : GetBucketLoggingOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketLoggingOutcome(outcome.error()); + } +} + +GetBucketWebsiteOutcome +OssClientImpl::GetBucketWebsite(const GetBucketWebsiteRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketWebsiteResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketWebsiteOutcome(std::move(result)) + : GetBucketWebsiteOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketWebsiteOutcome(outcome.error()); + } +} + +GetBucketRefererOutcome +OssClientImpl::GetBucketReferer(const GetBucketRefererRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketRefererResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketRefererOutcome(std::move(result)) + : GetBucketRefererOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketRefererOutcome(outcome.error()); + } +} + +GetBucketLifecycleOutcome OssClientImpl::GetBucketLifecycle( + const GetBucketLifecycleRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketLifecycleResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketLifecycleOutcome(std::move(result)) + : GetBucketLifecycleOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketLifecycleOutcome(outcome.error()); + } +} + +GetBucketStatOutcome +OssClientImpl::GetBucketStat(const GetBucketStatRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketStatResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketStatOutcome(std::move(result)) + : GetBucketStatOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketStatOutcome(outcome.error()); + } +} + +GetBucketCorsOutcome +OssClientImpl::GetBucketCors(const GetBucketCorsRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketCorsResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketCorsOutcome(std::move(result)) + : GetBucketCorsOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketCorsOutcome(outcome.error()); + } +} + +GetBucketStorageCapacityOutcome OssClientImpl::GetBucketStorageCapacity( + const GetBucketStorageCapacityRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketStorageCapacityResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketStorageCapacityOutcome(std::move(result)) + : GetBucketStorageCapacityOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketStorageCapacityOutcome(outcome.error()); + } +} + +GetBucketPolicyOutcome +OssClientImpl::GetBucketPolicy(const GetBucketPolicyRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketPolicyResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketPolicyOutcome(std::move(result)) + : GetBucketPolicyOutcome(OssError( + "ParseXMLError", "Parsing ListObject result fail.")); + } else { + return GetBucketPolicyOutcome(outcome.error()); + } +} +GetBucketPaymentOutcome OssClientImpl::GetBucketRequestPayment( + const GetBucketRequestPaymentRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketPaymentResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketPaymentOutcome(std::move(result)) + : GetBucketPaymentOutcome(OssError( + "ParseXMLError", "Parsing GetBucketPayment result fail.")); + } else { + return GetBucketPaymentOutcome(outcome.error()); + } +} + +GetBucketEncryptionOutcome OssClientImpl::GetBucketEncryption( + const GetBucketEncryptionRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketEncryptionResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketEncryptionOutcome(std::move(result)) + : GetBucketEncryptionOutcome( + OssError("ParseXMLError", + "Parsing GetBucketEncryption result fail.")); + } else { + return GetBucketEncryptionOutcome(outcome.error()); + } +} + +GetBucketTaggingOutcome +OssClientImpl::GetBucketTagging(const GetBucketTaggingRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketTaggingResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketTaggingOutcome(std::move(result)) + : GetBucketTaggingOutcome(OssError( + "ParseXMLError", "Parsing GetBucketTagging result fail.")); + } else { + return GetBucketTaggingOutcome(outcome.error()); + } +} + +GetBucketQosInfoOutcome +OssClientImpl::GetBucketQosInfo(const GetBucketQosInfoRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketQosInfoResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketQosInfoOutcome(std::move(result)) + : GetBucketQosInfoOutcome(OssError( + "ParseXMLError", "Parsing GetBucketQosInfo result fail.")); + } else { + return GetBucketQosInfoOutcome(outcome.error()); + } +} + +GetUserQosInfoOutcome +OssClientImpl::GetUserQosInfo(const GetUserQosInfoRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetUserQosInfoResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetUserQosInfoOutcome(std::move(result)) + : GetUserQosInfoOutcome(OssError( + "ParseXMLError", "Parsing GetUserQosInfo result fail.")); + } else { + return GetUserQosInfoOutcome(outcome.error()); + } +} + +GetBucketVersioningOutcome OssClientImpl::GetBucketVersioning( + const GetBucketVersioningRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketVersioningResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketVersioningOutcome(std::move(result)) + : GetBucketVersioningOutcome( + OssError("ParseXMLError", + "Parsing GetBucketVersioning result fail.")); + } else { + return GetBucketVersioningOutcome(outcome.error()); + } +} + +GetBucketInventoryConfigurationOutcome +OssClientImpl::GetBucketInventoryConfiguration( + const GetBucketInventoryConfigurationRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketInventoryConfigurationResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketInventoryConfigurationOutcome(std::move(result)) + : GetBucketInventoryConfigurationOutcome(OssError( + "ParseXMLError", + "Parsing GetBucketInventoryConfiguration result fail.")); + } else { + return GetBucketInventoryConfigurationOutcome(outcome.error()); + } +} + +ListBucketInventoryConfigurationsOutcome +OssClientImpl::ListBucketInventoryConfigurations( + const ListBucketInventoryConfigurationsRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + ListBucketInventoryConfigurationsResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? ListBucketInventoryConfigurationsOutcome(std::move(result)) + : ListBucketInventoryConfigurationsOutcome(OssError( + "ParseXMLError", + "Parsing ListBucketInventoryConfigurations result fail.")); + } else { + return ListBucketInventoryConfigurationsOutcome(outcome.error()); + } +} + +InitiateBucketWormOutcome OssClientImpl::InitiateBucketWorm( + const InitiateBucketWormRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + if (outcome.isSuccess()) { + return InitiateBucketWormOutcome( + InitiateBucketWormResult(outcome.result().headerCollection())); + } else { + return InitiateBucketWormOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::AbortBucketWorm(const AbortBucketWormRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::CompleteBucketWorm( + const CompleteBucketWormRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::ExtendBucketWormWorm( + const ExtendBucketWormRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +GetBucketWormOutcome +OssClientImpl::GetBucketWorm(const GetBucketWormRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetBucketWormResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? GetBucketWormOutcome(std::move(result)) + : GetBucketWormOutcome(OssError( + "ParseXMLError", "Parsing GetBucketWorm result fail.")); + } else { + return GetBucketWormOutcome(outcome.error()); + } } +#endif -ListObjectVersionsOutcome OssClientImpl::ListObjectVersions(const ListObjectVersionsRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - ListObjectVersionsResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? ListObjectVersionsOutcome(std::move(result)) : - ListObjectVersionsOutcome(OssError("ParseXMLError", "Parsing ListObjectVersions result fail.")); - } - else { - return ListObjectVersionsOutcome(outcome.error()); - } +ListObjectOutcome +OssClientImpl::ListObjects(const ListObjectsRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + ListObjectsResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? ListObjectOutcome(std::move(result)) + : ListObjectOutcome(OssError("ParseXMLError", + "Parsing ListObject result fail.")); + } else { + return ListObjectOutcome(outcome.error()); + } +} + +ListObjectsV2Outcome +OssClientImpl::ListObjectsV2(const ListObjectsV2Request &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + ListObjectsV2Result result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? ListObjectsV2Outcome(std::move(result)) + : ListObjectsV2Outcome(OssError( + "ParseXMLError", "Parsing ListObjectV2 result fail.")); + } else { + return ListObjectsV2Outcome(outcome.error()); + } +} + +ListObjectVersionsOutcome OssClientImpl::ListObjectVersions( + const ListObjectVersionsRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + ListObjectVersionsResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() ? ListObjectVersionsOutcome(std::move(result)) + : ListObjectVersionsOutcome(OssError( + "ParseXMLError", + "Parsing ListObjectVersions result fail.")); + } else { + return ListObjectVersionsOutcome(outcome.error()); + } } #undef GetObject -GetObjectOutcome OssClientImpl::GetObject(const GetObjectRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - return GetObjectOutcome(GetObjectResult(request.Bucket(), request.Key(), - outcome.result().payload(),outcome.result().headerCollection())); - } - else { - return GetObjectOutcome(outcome.error()); - } -} - -PutObjectOutcome OssClientImpl::PutObject(const PutObjectRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - return PutObjectOutcome(PutObjectResult(outcome.result().headerCollection(), - outcome.result().payload())); - } - else { - return PutObjectOutcome(outcome.error()); - } -} - -DeleteObjectOutcome OssClientImpl::DeleteObject(const DeleteObjectRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - return DeleteObjectOutcome(DeleteObjectResult(outcome.result().headerCollection())); - } - else { - return DeleteObjectOutcome(outcome.error()); - } -} - -DeleteObjecstOutcome OssClientImpl::DeleteObjects(const DeleteObjectsRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - if (outcome.isSuccess()) { - DeleteObjectsResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? DeleteObjecstOutcome(std::move(result)) : - DeleteObjecstOutcome(OssError("ParseXMLError", "Parsing DeleteObjects result fail.")); - } - else { - return DeleteObjecstOutcome(outcome.error()); - } -} - -DeleteObjecVersionstOutcome OssClientImpl::DeleteObjectVersions(const DeleteObjectVersionsRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - if (outcome.isSuccess()) { - DeleteObjectVersionsResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? DeleteObjecVersionstOutcome(std::move(result)) : - DeleteObjecVersionstOutcome(OssError("ParseXMLError", "Parsing DeleteObjectVersions result fail.")); - } - else { - return DeleteObjecVersionstOutcome(outcome.error()); - } -} - -ObjectMetaDataOutcome OssClientImpl::HeadObject(const HeadObjectRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Head); - if (outcome.isSuccess()) { - ObjectMetaData metaData = outcome.result().headerCollection(); - return ObjectMetaDataOutcome(std::move(metaData)); - } - else { - return ObjectMetaDataOutcome(outcome.error()); - } -} - -ObjectMetaDataOutcome OssClientImpl::GetObjectMeta(const GetObjectMetaRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Head); - if (outcome.isSuccess()) { - ObjectMetaData metaData = outcome.result().headerCollection(); - return ObjectMetaDataOutcome(std::move(metaData)); - } - else { - return ObjectMetaDataOutcome(outcome.error()); - } -} - -GetObjectAclOutcome OssClientImpl::GetObjectAcl(const GetObjectAclRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetObjectAclResult result(outcome.result().headerCollection(), outcome.result().payload()); - return result.ParseDone() ? GetObjectAclOutcome(std::move(result)) : - GetObjectAclOutcome(OssError("ParseXMLError", "Parsing GetObjectAcl result fail.")); - } - else { - return GetObjectAclOutcome(outcome.error()); - } -} - -AppendObjectOutcome OssClientImpl::AppendObject(const AppendObjectRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - if (outcome.isSuccess()) { - AppendObjectResult result(outcome.result().headerCollection()); - return result.ParseDone() ? AppendObjectOutcome(std::move(result)) : - AppendObjectOutcome(OssError("ParseXMLError", "no position or no crc64")); - } - else { - return AppendObjectOutcome(outcome.error()); - } -} - -CopyObjectOutcome OssClientImpl::CopyObject(const CopyObjectRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - return CopyObjectOutcome(CopyObjectResult(outcome.result().headerCollection(), outcome.result().payload())); - } - else { - return CopyObjectOutcome(outcome.error()); - } -} - -GetSymlinkOutcome OssClientImpl::GetSymlink(const GetSymlinkRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - return GetSymlinkOutcome(GetSymlinkResult(outcome.result().headerCollection())); - } - else { - return GetSymlinkOutcome(outcome.error()); - } -} - -RestoreObjectOutcome OssClientImpl::RestoreObject(const RestoreObjectRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - if (outcome.isSuccess()) { - return RestoreObjectOutcome(RestoreObjectResult(outcome.result().headerCollection())); - } - else { - return RestoreObjectOutcome(outcome.error()); - } -} - -CreateSymlinkOutcome OssClientImpl::CreateSymlink(const CreateSymlinkRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - return CreateSymlinkOutcome(CreateSymlinkResult(outcome.result().headerCollection())); - } - else { - return CreateSymlinkOutcome(outcome.error()); - } -} - -SetObjectAclOutcome OssClientImpl::SetObjectAcl(const SetObjectAclRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - return SetObjectAclOutcome(SetObjectAclResult(outcome.result().headerCollection())); - } - else { - return SetObjectAclOutcome(outcome.error()); - } -} - -GetObjectOutcome OssClientImpl::ProcessObject(const ProcessObjectRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - if (outcome.isSuccess()) { - return GetObjectOutcome(GetObjectResult(request.Bucket(), request.Key(), - outcome.result().payload(), outcome.result().headerCollection())); - } - else { - return GetObjectOutcome(outcome.error()); - } -} - -GetObjectOutcome OssClientImpl::SelectObject(const SelectObjectRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - int ret = request.dispose(); - if (outcome.isSuccess()) { - return GetObjectOutcome(GetObjectResult(request.Bucket(), request.Key(), - outcome.result().payload(), outcome.result().headerCollection())); - } - else { - if (ret != 0) { - return GetObjectOutcome(OssError("SelectObjectError", request.validateMessage(ret))); - } - return GetObjectOutcome(outcome.error()); - } -} - -CreateSelectObjectMetaOutcome OssClientImpl::CreateSelectObjectMeta(const CreateSelectObjectMetaRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Method::Post); - if (outcome.isSuccess()) { - CreateSelectObjectMetaResult result(request.Bucket(), request.Key(), - outcome.result().RequestId(), outcome.result().payload()); - return result.ParseDone() ? CreateSelectObjectMetaOutcome(result) : - CreateSelectObjectMetaOutcome(OssError("ParseIOStreamError", "Parse create select object meta IOStream fail.")); - } - else { - return CreateSelectObjectMetaOutcome(outcome.error()); - } -} - -SetObjectTaggingOutcome OssClientImpl::SetObjectTagging(const SetObjectTaggingRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Put); - if (outcome.isSuccess()) { - return SetObjectTaggingOutcome(SetObjectTaggingResult(outcome.result().headerCollection())); - } - else { - return SetObjectTaggingOutcome(outcome.error()); - } -} - -DeleteObjectTaggingOutcome OssClientImpl::DeleteObjectTagging(const DeleteObjectTaggingRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Delete); - if (outcome.isSuccess()) { - return DeleteObjectTaggingOutcome(DeleteObjectTaggingResult(outcome.result().headerCollection())); - } - else { - return DeleteObjectTaggingOutcome(outcome.error()); - } -} - -GetObjectTaggingOutcome OssClientImpl::GetObjectTagging(const GetObjectTaggingRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Method::Get); - if (outcome.isSuccess()) { - GetObjectTaggingResult result(outcome.result().headerCollection(), outcome.result().payload()); - return result.ParseDone() ? GetObjectTaggingOutcome(std::move(result)) : - GetObjectTaggingOutcome(OssError("ParseXMLError", "Parsing ObjectTagging result fail.")); - } - else { - return GetObjectTaggingOutcome(outcome.error()); - } -} - -StringOutcome OssClientImpl::GeneratePresignedUrl(const GeneratePresignedUrlRequest &request) const -{ - if (!IsValidBucketName(request.bucket_) || - !IsValidObjectKey(request.key_)) { - return StringOutcome(OssError("ValidateError", "The Bucket or Key is invalid.")); - } - - HeaderCollection headers = request.metaData_.toHeaderCollection(); - - ParameterCollection parameters; - const Credentials credentials = credentialsProvider_->getCredentials(); - if (!credentials.SessionToken().empty()) { - parameters["security-token"] = credentials.SessionToken(); - } - for (auto const¶m : request.parameters_) { - parameters[param.first] = param.second; - } - - SignUtils signUtils(signer_->version()); - auto method = Http::MethodToString(request.method_); - auto resource = std::string().append("/").append(request.bucket_).append("/").append(request.key_); - auto date = headers[Http::EXPIRES]; - signUtils.build(method, resource, date, headers, parameters); - auto signature = signer_->generate(signUtils.CanonicalString(), credentials.AccessKeySecret()); - parameters["Expires"] = date; - parameters["OSSAccessKeyId"] = credentials.AccessKeyId(); - parameters["Signature"] = signature; - - //host - std::stringstream ss; - ss << CombineHostString(endpoint_, request.bucket_, configuration().isCname, configuration().isPathStyle); - //path - auto path = CombinePathString(endpoint_, request.bucket_, request.key_, configuration().isPathStyle); - if (request.unencodedSlash_) { - StringReplace(path, "%2F", "/"); - } - ss << path; - //query - ss << "?"; - ss << CombineQueryString(parameters); - - return StringOutcome(ss.str()); -} - -GetObjectOutcome OssClientImpl::GetObjectByUrl(const GetObjectByUrlRequest &request) const -{ - auto outcome = BASE::AttemptRequest(endpoint_, request, Http::Method::Get); - if (outcome.isSuccess()) { - return GetObjectOutcome(GetObjectResult("", "", - outcome.result()->Body(), - outcome.result()->Headers())); - } - else { - return GetObjectOutcome(buildError(outcome.error())); - } -} - -PutObjectOutcome OssClientImpl::PutObjectByUrl(const PutObjectByUrlRequest &request) const -{ - auto outcome = BASE::AttemptRequest(endpoint_, request, Http::Method::Put); - if (outcome.isSuccess()) { - return PutObjectOutcome(PutObjectResult(outcome.result()->Headers(), - outcome.result()->Body())); - } - else { - return PutObjectOutcome(buildError(outcome.error())); - } -} - -InitiateMultipartUploadOutcome OssClientImpl::InitiateMultipartUpload(const InitiateMultipartUploadRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Post); - if(outcome.isSuccess()){ - InitiateMultipartUploadResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? InitiateMultipartUploadOutcome(std::move(result)): - InitiateMultipartUploadOutcome( - OssError("InitiateMultipartUploadError", - "Parsing InitiateMultipartUploadResult fail")); - } - else{ - return InitiateMultipartUploadOutcome(outcome.error()); - } -} - -PutObjectOutcome OssClientImpl::UploadPart(const UploadPartRequest &request)const -{ - auto outcome = MakeRequest(request, Http::Put); - if(outcome.isSuccess()){ - const HeaderCollection& header = outcome.result().headerCollection(); - return PutObjectOutcome(PutObjectResult(header)); - }else{ - return PutObjectOutcome(outcome.error()); - } -} - -UploadPartCopyOutcome OssClientImpl::UploadPartCopy(const UploadPartCopyRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Put); - if(outcome.isSuccess()){ - const HeaderCollection& header = outcome.result().headerCollection(); - return UploadPartCopyOutcome( - UploadPartCopyResult(outcome.result().payload(), header)); - } - else{ - return UploadPartCopyOutcome(outcome.error()); - } -} - -CompleteMultipartUploadOutcome OssClientImpl::CompleteMultipartUpload(const CompleteMultipartUploadRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Post); - if (outcome.isSuccess()){ - CompleteMultipartUploadResult result(outcome.result().payload(), outcome.result().headerCollection()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? - CompleteMultipartUploadOutcome(std::move(result)) : - CompleteMultipartUploadOutcome(OssError("CompleteMultipartUpload", "")); - } - else { - return CompleteMultipartUploadOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::AbortMultipartUpload(const AbortMultipartUploadRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Delete); - if(outcome.isSuccess()){ - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - } - else { - return VoidOutcome(outcome.error()); - } +GetObjectOutcome +OssClientImpl::GetObject(const GetObjectRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + return GetObjectOutcome(GetObjectResult( + request.Bucket(), request.Key(), outcome.result().payload(), + outcome.result().headerCollection())); + } else { + return GetObjectOutcome(outcome.error()); + } +} + +PutObjectOutcome +OssClientImpl::PutObject(const PutObjectRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + return PutObjectOutcome(PutObjectResult(outcome.result().headerCollection(), + outcome.result().payload())); + } else { + return PutObjectOutcome(outcome.error()); + } +} + +DeleteObjectOutcome +OssClientImpl::DeleteObject(const DeleteObjectRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + return DeleteObjectOutcome( + DeleteObjectResult(outcome.result().headerCollection())); + } else { + return DeleteObjectOutcome(outcome.error()); + } +} + +DeleteObjecstOutcome +OssClientImpl::DeleteObjects(const DeleteObjectsRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + if (outcome.isSuccess()) { + DeleteObjectsResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? DeleteObjecstOutcome(std::move(result)) + : DeleteObjecstOutcome(OssError( + "ParseXMLError", "Parsing DeleteObjects result fail.")); + } else { + return DeleteObjecstOutcome(outcome.error()); + } +} + +DeleteObjecVersionstOutcome OssClientImpl::DeleteObjectVersions( + const DeleteObjectVersionsRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + if (outcome.isSuccess()) { + DeleteObjectVersionsResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? DeleteObjecVersionstOutcome(std::move(result)) + : DeleteObjecVersionstOutcome( + OssError("ParseXMLError", + "Parsing DeleteObjectVersions result fail.")); + } else { + return DeleteObjecVersionstOutcome(outcome.error()); + } +} + +ObjectMetaDataOutcome +OssClientImpl::HeadObject(const HeadObjectRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Head); + if (outcome.isSuccess()) { + ObjectMetaData metaData = outcome.result().headerCollection(); + return ObjectMetaDataOutcome(std::move(metaData)); + } else { + return ObjectMetaDataOutcome(outcome.error()); + } +} + +ObjectMetaDataOutcome +OssClientImpl::GetObjectMeta(const GetObjectMetaRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Head); + if (outcome.isSuccess()) { + ObjectMetaData metaData = outcome.result().headerCollection(); + return ObjectMetaDataOutcome(std::move(metaData)); + } else { + return ObjectMetaDataOutcome(outcome.error()); + } +} + +GetObjectAclOutcome +OssClientImpl::GetObjectAcl(const GetObjectAclRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetObjectAclResult result(outcome.result().headerCollection(), + outcome.result().payload()); + return result.ParseDone() + ? GetObjectAclOutcome(std::move(result)) + : GetObjectAclOutcome(OssError( + "ParseXMLError", "Parsing GetObjectAcl result fail.")); + } else { + return GetObjectAclOutcome(outcome.error()); + } +} + +AppendObjectOutcome +OssClientImpl::AppendObject(const AppendObjectRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + if (outcome.isSuccess()) { + AppendObjectResult result(outcome.result().headerCollection()); + return result.ParseDone() + ? AppendObjectOutcome(std::move(result)) + : AppendObjectOutcome( + OssError("ParseXMLError", "no position or no crc64")); + } else { + return AppendObjectOutcome(outcome.error()); + } +} + +CopyObjectOutcome +OssClientImpl::CopyObject(const CopyObjectRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + return CopyObjectOutcome(CopyObjectResult( + outcome.result().headerCollection(), outcome.result().payload())); + } else { + return CopyObjectOutcome(outcome.error()); + } +} + +GetSymlinkOutcome +OssClientImpl::GetSymlink(const GetSymlinkRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + return GetSymlinkOutcome( + GetSymlinkResult(outcome.result().headerCollection())); + } else { + return GetSymlinkOutcome(outcome.error()); + } +} + +RestoreObjectOutcome +OssClientImpl::RestoreObject(const RestoreObjectRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + if (outcome.isSuccess()) { + return RestoreObjectOutcome( + RestoreObjectResult(outcome.result().headerCollection())); + } else { + return RestoreObjectOutcome(outcome.error()); + } +} + +CreateSymlinkOutcome +OssClientImpl::CreateSymlink(const CreateSymlinkRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + return CreateSymlinkOutcome( + CreateSymlinkResult(outcome.result().headerCollection())); + } else { + return CreateSymlinkOutcome(outcome.error()); + } +} + +SetObjectAclOutcome +OssClientImpl::SetObjectAcl(const SetObjectAclRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + return SetObjectAclOutcome( + SetObjectAclResult(outcome.result().headerCollection())); + } else { + return SetObjectAclOutcome(outcome.error()); + } +} + +GetObjectOutcome +OssClientImpl::ProcessObject(const ProcessObjectRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + if (outcome.isSuccess()) { + return GetObjectOutcome(GetObjectResult( + request.Bucket(), request.Key(), outcome.result().payload(), + outcome.result().headerCollection())); + } else { + return GetObjectOutcome(outcome.error()); + } +} + +GetObjectOutcome +OssClientImpl::SelectObject(const SelectObjectRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + int ret = request.dispose(); + if (outcome.isSuccess()) { + return GetObjectOutcome(GetObjectResult( + request.Bucket(), request.Key(), outcome.result().payload(), + outcome.result().headerCollection())); + } else { + if (ret != 0) { + return GetObjectOutcome( + OssError("SelectObjectError", request.validateMessage(ret))); + } + return GetObjectOutcome(outcome.error()); + } +} + +CreateSelectObjectMetaOutcome OssClientImpl::CreateSelectObjectMeta( + const CreateSelectObjectMetaRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Post); + if (outcome.isSuccess()) { + CreateSelectObjectMetaResult result(request.Bucket(), request.Key(), + outcome.result().RequestId(), + outcome.result().payload()); + return result.ParseDone() + ? CreateSelectObjectMetaOutcome(result) + : CreateSelectObjectMetaOutcome(OssError( + "ParseIOStreamError", + "Parse create select object meta IOStream fail.")); + } else { + return CreateSelectObjectMetaOutcome(outcome.error()); + } +} + +SetObjectTaggingOutcome +OssClientImpl::SetObjectTagging(const SetObjectTaggingRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Put); + if (outcome.isSuccess()) { + return SetObjectTaggingOutcome( + SetObjectTaggingResult(outcome.result().headerCollection())); + } else { + return SetObjectTaggingOutcome(outcome.error()); + } +} + +DeleteObjectTaggingOutcome OssClientImpl::DeleteObjectTagging( + const DeleteObjectTaggingRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Delete); + if (outcome.isSuccess()) { + return DeleteObjectTaggingOutcome( + DeleteObjectTaggingResult(outcome.result().headerCollection())); + } else { + return DeleteObjectTaggingOutcome(outcome.error()); + } +} + +GetObjectTaggingOutcome +OssClientImpl::GetObjectTagging(const GetObjectTaggingRequest &request) const { + auto outcome = MakeRequest(request, Http::Method::Get); + if (outcome.isSuccess()) { + GetObjectTaggingResult result(outcome.result().headerCollection(), + outcome.result().payload()); + return result.ParseDone() + ? GetObjectTaggingOutcome(std::move(result)) + : GetObjectTaggingOutcome(OssError( + "ParseXMLError", "Parsing ObjectTagging result fail.")); + } else { + return GetObjectTaggingOutcome(outcome.error()); + } +} + +StringOutcome OssClientImpl::GeneratePresignedUrl( + const GeneratePresignedUrlRequest &request) const { + if (!IsValidBucketName(request.bucket_) || !IsValidObjectKey(request.key_)) { + return StringOutcome( + OssError("ValidateError", "The Bucket or Key is invalid.")); + } + + HeaderCollection headers = request.metaData_.toHeaderCollection(); + + ParameterCollection parameters; + const Credentials credentials = credentialsProvider_->getCredentials(); + if (!credentials.SessionToken().empty()) { + parameters["security-token"] = credentials.SessionToken(); + } + for (auto const ¶m : request.parameters_) { + parameters[param.first] = param.second; + } + + SignUtils signUtils(signer_->version()); + auto method = Http::MethodToString(request.method_); + auto resource = std::string() + .append("/") + .append(request.bucket_) + .append("/") + .append(request.key_); + auto date = headers[Http::EXPIRES]; + signUtils.build(method, resource, date, headers, parameters); + auto signature = signer_->generate(signUtils.CanonicalString(), + credentials.AccessKeySecret()); + parameters["Expires"] = date; + parameters["OSSAccessKeyId"] = credentials.AccessKeyId(); + parameters["Signature"] = signature; + + // host + std::stringstream ss; + ss << CombineHostString(endpoint_, request.bucket_, configuration().isCname, + configuration().isPathStyle); + // path + auto path = CombinePathString(endpoint_, request.bucket_, request.key_, + configuration().isPathStyle); + if (request.unencodedSlash_) { + StringReplace(path, "%2F", "/"); + } + ss << path; + // query + ss << "?"; + ss << CombineQueryString(parameters); + + return StringOutcome(ss.str()); +} + +GetObjectOutcome +OssClientImpl::GetObjectByUrl(const GetObjectByUrlRequest &request) const { + auto outcome = BASE::AttemptRequest(endpoint_, request, Http::Method::Get); + if (outcome.isSuccess()) { + return GetObjectOutcome(GetObjectResult("", "", outcome.result()->Body(), + outcome.result()->Headers())); + } else { + return GetObjectOutcome(buildError(outcome.error())); + } +} + +PutObjectOutcome +OssClientImpl::PutObjectByUrl(const PutObjectByUrlRequest &request) const { + auto outcome = BASE::AttemptRequest(endpoint_, request, Http::Method::Put); + if (outcome.isSuccess()) { + return PutObjectOutcome( + PutObjectResult(outcome.result()->Headers(), outcome.result()->Body())); + } else { + return PutObjectOutcome(buildError(outcome.error())); + } +} + +InitiateMultipartUploadOutcome OssClientImpl::InitiateMultipartUpload( + const InitiateMultipartUploadRequest &request) const { + auto outcome = MakeRequest(request, Http::Post); + if (outcome.isSuccess()) { + InitiateMultipartUploadResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? InitiateMultipartUploadOutcome(std::move(result)) + : InitiateMultipartUploadOutcome( + OssError("InitiateMultipartUploadError", + "Parsing InitiateMultipartUploadResult fail")); + } else { + return InitiateMultipartUploadOutcome(outcome.error()); + } +} + +PutObjectOutcome +OssClientImpl::UploadPart(const UploadPartRequest &request) const { + auto outcome = MakeRequest(request, Http::Put); + if (outcome.isSuccess()) { + const HeaderCollection &header = outcome.result().headerCollection(); + return PutObjectOutcome(PutObjectResult(header)); + } else { + return PutObjectOutcome(outcome.error()); + } +} + +UploadPartCopyOutcome +OssClientImpl::UploadPartCopy(const UploadPartCopyRequest &request) const { + auto outcome = MakeRequest(request, Http::Put); + if (outcome.isSuccess()) { + const HeaderCollection &header = outcome.result().headerCollection(); + return UploadPartCopyOutcome( + UploadPartCopyResult(outcome.result().payload(), header)); + } else { + return UploadPartCopyOutcome(outcome.error()); + } +} + +CompleteMultipartUploadOutcome OssClientImpl::CompleteMultipartUpload( + const CompleteMultipartUploadRequest &request) const { + auto outcome = MakeRequest(request, Http::Post); + if (outcome.isSuccess()) { + CompleteMultipartUploadResult result(outcome.result().payload(), + outcome.result().headerCollection()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? CompleteMultipartUploadOutcome(std::move(result)) + : CompleteMultipartUploadOutcome( + OssError("CompleteMultipartUpload", "")); + } else { + return CompleteMultipartUploadOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::AbortMultipartUpload( + const AbortMultipartUploadRequest &request) const { + auto outcome = MakeRequest(request, Http::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } } ListMultipartUploadsOutcome OssClientImpl::ListMultipartUploads( - const ListMultipartUploadsRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Get); - if(outcome.isSuccess()) - { - ListMultipartUploadsResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? - ListMultipartUploadsOutcome(std::move(result)) : - ListMultipartUploadsOutcome(OssError("ListMultipartUploads", "Parse Error")); - } - else { - return ListMultipartUploadsOutcome(outcome.error()); - } -} - -ListPartsOutcome OssClientImpl::ListParts(const ListPartsRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Get); - if(outcome.isSuccess()) - { - ListPartsResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone() ? - ListPartsOutcome(std::move(result)) : - ListPartsOutcome(OssError("ListParts", "Parse Error")); - }else{ - return ListPartsOutcome(outcome.error()); - } + const ListMultipartUploadsRequest &request) const { + auto outcome = MakeRequest(request, Http::Get); + if (outcome.isSuccess()) { + ListMultipartUploadsResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() ? ListMultipartUploadsOutcome(std::move(result)) + : ListMultipartUploadsOutcome(OssError( + "ListMultipartUploads", "Parse Error")); + } else { + return ListMultipartUploadsOutcome(outcome.error()); + } +} + +ListPartsOutcome +OssClientImpl::ListParts(const ListPartsRequest &request) const { + auto outcome = MakeRequest(request, Http::Get); + if (outcome.isSuccess()) { + ListPartsResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() + ? ListPartsOutcome(std::move(result)) + : ListPartsOutcome(OssError("ListParts", "Parse Error")); + } else { + return ListPartsOutcome(outcome.error()); + } } #if !defined(OSS_DISABLE_RESUAMABLE) /*Resumable Operation*/ -PutObjectOutcome OssClientImpl::ResumableUploadObject(const UploadObjectRequest& request) const -{ - const auto& reqeustBase = static_cast(request); - int code = reqeustBase.validate(); - if (code != 0) { - return PutObjectOutcome(OssError("ValidateError", reqeustBase.validateMessage(code))); - } - - if (request.ObjectSize() <= request.PartSize()) - { - auto content = GetFstreamByPath(request.FilePath(), request.FilePathW(), - std::ios::in | std::ios::binary); - PutObjectRequest putObjectReq(request.Bucket(), request.Key(), content, request.MetaData()); - if (request.TransferProgress().Handler) { - putObjectReq.setTransferProgress(request.TransferProgress()); - } - if (request.RequestPayer() == RequestPayer::Requester) { - putObjectReq.setRequestPayer(request.RequestPayer()); - } - if (request.TrafficLimit() != 0) { - putObjectReq.setTrafficLimit(request.TrafficLimit()); - } - return PutObject(putObjectReq); - } - else - { - ResumableUploader uploader(request, this); - return uploader.Upload(); +PutObjectOutcome +OssClientImpl::ResumableUploadObject(const UploadObjectRequest &request) const { + const auto &reqeustBase = + static_cast(request); + int code = reqeustBase.validate(); + if (code != 0) { + return PutObjectOutcome( + OssError("ValidateError", reqeustBase.validateMessage(code))); + } + + if (request.ObjectSize() <= request.PartSize()) { + auto content = GetFstreamByPath(request.FilePath(), request.FilePathW(), + std::ios::in | std::ios::binary); + PutObjectRequest putObjectReq(request.Bucket(), request.Key(), content, + request.MetaData()); + if (request.TransferProgress().Handler) { + putObjectReq.setTransferProgress(request.TransferProgress()); } -} - -CopyObjectOutcome OssClientImpl::ResumableCopyObject(const MultiCopyObjectRequest& request) const -{ - const auto& reqeustBase = static_cast(request); - int code = reqeustBase.validate(); - if (code != 0) { - return CopyObjectOutcome(OssError("ValidateError", reqeustBase.validateMessage(code))); - } - - auto getObjectMetaReq = GetObjectMetaRequest(request.SrcBucket(), request.SrcKey()); if (request.RequestPayer() == RequestPayer::Requester) { - getObjectMetaReq.setRequestPayer(request.RequestPayer()); - } - if (!request.VersionId().empty()) { - getObjectMetaReq.setVersionId(request.VersionId()); - } - auto outcome = GetObjectMeta(getObjectMetaReq); - if (!outcome.isSuccess()) { - return CopyObjectOutcome(outcome.error()); + putObjectReq.setRequestPayer(request.RequestPayer()); + } + if (request.TrafficLimit() != 0) { + putObjectReq.setTrafficLimit(request.TrafficLimit()); + } + return PutObject(putObjectReq); + } else { + ResumableUploader uploader(request, this); + return uploader.Upload(); + } +} + +CopyObjectOutcome OssClientImpl::ResumableCopyObject( + const MultiCopyObjectRequest &request) const { + const auto &reqeustBase = + static_cast(request); + int code = reqeustBase.validate(); + if (code != 0) { + return CopyObjectOutcome( + OssError("ValidateError", reqeustBase.validateMessage(code))); + } + + auto getObjectMetaReq = + GetObjectMetaRequest(request.SrcBucket(), request.SrcKey()); + if (request.RequestPayer() == RequestPayer::Requester) { + getObjectMetaReq.setRequestPayer(request.RequestPayer()); + } + if (!request.VersionId().empty()) { + getObjectMetaReq.setVersionId(request.VersionId()); + } + auto outcome = GetObjectMeta(getObjectMetaReq); + if (!outcome.isSuccess()) { + return CopyObjectOutcome(outcome.error()); + } + + auto objectSize = outcome.result().ContentLength(); + if (objectSize < (int64_t)request.PartSize()) { + auto copyObjectReq = + CopyObjectRequest(request.Bucket(), request.Key(), request.MetaData()); + copyObjectReq.setCopySource(request.SrcBucket(), request.SrcKey()); + if (request.RequestPayer() == RequestPayer::Requester) { + copyObjectReq.setRequestPayer(request.RequestPayer()); } - - auto objectSize = outcome.result().ContentLength(); - if (objectSize < (int64_t)request.PartSize()) { - auto copyObjectReq = CopyObjectRequest(request.Bucket(), request.Key(), request.MetaData()); - copyObjectReq.setCopySource(request.SrcBucket(), request.SrcKey()); - if (request.RequestPayer() == RequestPayer::Requester) { - copyObjectReq.setRequestPayer(request.RequestPayer()); - } - if (request.TrafficLimit() != 0) { - copyObjectReq.setTrafficLimit(request.TrafficLimit()); - } - if (!request.VersionId().empty()) { - copyObjectReq.setVersionId(request.VersionId()); - } - return CopyObject(copyObjectReq); + if (request.TrafficLimit() != 0) { + copyObjectReq.setTrafficLimit(request.TrafficLimit()); } - - ResumableCopier copier(request, this, objectSize); - return copier.Copy(); -} - -GetObjectOutcome OssClientImpl::ResumableDownloadObject(const DownloadObjectRequest &request) const -{ - const auto& reqeustBase = static_cast(request); - int code = reqeustBase.validate(); - if (code != 0) { - return GetObjectOutcome(OssError("ValidateError", reqeustBase.validateMessage(code))); + if (!request.VersionId().empty()) { + copyObjectReq.setVersionId(request.VersionId()); + } + return CopyObject(copyObjectReq); + } + + ResumableCopier copier(request, this, objectSize); + return copier.Copy(); +} + +GetObjectOutcome OssClientImpl::ResumableDownloadObject( + const DownloadObjectRequest &request) const { + const auto &reqeustBase = + static_cast(request); + int code = reqeustBase.validate(); + if (code != 0) { + return GetObjectOutcome( + OssError("ValidateError", reqeustBase.validateMessage(code))); + } + + auto getObjectMetaReq = GetObjectMetaRequest(request.Bucket(), request.Key()); + if (request.RequestPayer() == RequestPayer::Requester) { + getObjectMetaReq.setRequestPayer(request.RequestPayer()); + } + if (!request.VersionId().empty()) { + getObjectMetaReq.setVersionId(request.VersionId()); + } + auto hOutcome = GetObjectMeta(getObjectMetaReq); + if (!hOutcome.isSuccess()) { + return GetObjectOutcome(hOutcome.error()); + } + + auto objectSize = hOutcome.result().ContentLength(); + if (objectSize < (int64_t)request.PartSize()) { + auto getObjectReq = GetObjectRequest( + request.Bucket(), request.Key(), request.ModifiedSinceConstraint(), + request.UnmodifiedSinceConstraint(), request.MatchingETagsConstraint(), + request.NonmatchingETagsConstraint(), + request.ResponseHeaderParameters()); + if (request.RangeIsSet()) { + getObjectReq.setRange(request.RangeStart(), request.RangeEnd()); + } + if (request.TransferProgress().Handler) { + getObjectReq.setTransferProgress(request.TransferProgress()); } - - auto getObjectMetaReq = GetObjectMetaRequest(request.Bucket(), request.Key()); if (request.RequestPayer() == RequestPayer::Requester) { - getObjectMetaReq.setRequestPayer(request.RequestPayer()); + getObjectReq.setRequestPayer(request.RequestPayer()); } - if (!request.VersionId().empty()) { - getObjectMetaReq.setVersionId(request.VersionId()); + if (request.TrafficLimit() != 0) { + getObjectReq.setTrafficLimit(request.TrafficLimit()); } - auto hOutcome = GetObjectMeta(getObjectMetaReq); - if (!hOutcome.isSuccess()) { - return GetObjectOutcome(hOutcome.error()); + if (!request.VersionId().empty()) { + getObjectReq.setVersionId(request.VersionId()); + } + getObjectReq.setResponseStreamFactory([=]() { + return GetFstreamByPath(request.FilePath(), request.FilePathW(), + std::ios_base::out | std::ios_base::in | + std::ios_base::trunc | std::ios_base::binary); + }); + auto outcome = this->GetObject(getObjectReq); + std::shared_ptr content = nullptr; + outcome.result().setContent(content); + if (IsFileExist(request.TempFilePath())) { + RemoveFile(request.TempFilePath()); } - - auto objectSize = hOutcome.result().ContentLength(); - if (objectSize < (int64_t)request.PartSize()) { - auto getObjectReq = GetObjectRequest(request.Bucket(), request.Key(), request.ModifiedSinceConstraint(), request.UnmodifiedSinceConstraint(),request.MatchingETagsConstraint(), request.NonmatchingETagsConstraint(), request.ResponseHeaderParameters()); - if (request.RangeIsSet()) { - getObjectReq.setRange(request.RangeStart(), request.RangeEnd()); - } - if (request.TransferProgress().Handler) { - getObjectReq.setTransferProgress(request.TransferProgress()); - } - if (request.RequestPayer() == RequestPayer::Requester) { - getObjectReq.setRequestPayer(request.RequestPayer()); - } - if (request.TrafficLimit() != 0) { - getObjectReq.setTrafficLimit(request.TrafficLimit()); - } - if (!request.VersionId().empty()) { - getObjectReq.setVersionId(request.VersionId()); - } - getObjectReq.setResponseStreamFactory([=]() { - return GetFstreamByPath(request.FilePath(), request.FilePathW(), - std::ios_base::out | std::ios_base::in | std::ios_base::trunc | std::ios_base::binary); - }); - auto outcome = this->GetObject(getObjectReq); - std::shared_ptr content = nullptr; - outcome.result().setContent(content); - if (IsFileExist(request.TempFilePath())) { - RemoveFile(request.TempFilePath()); - } #ifdef _WIN32 - else if (IsFileExist(request.TempFilePathW())) { - RemoveFile(request.TempFilePathW()); - } -#endif - return outcome; + else if (IsFileExist(request.TempFilePathW())) { + RemoveFile(request.TempFilePathW()); } +#endif + return outcome; + } - ResumableDownloader downloader(request, this, objectSize); - return downloader.Download(); + ResumableDownloader downloader(request, this, objectSize); + return downloader.Download(); } #endif #if !defined(OSS_DISABLE_LIVECHANNEL) /*Live Channel*/ -VoidOutcome OssClientImpl::PutLiveChannelStatus(const PutLiveChannelStatusRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Put); - if(outcome.isSuccess()) - { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(result); - }else{ - return VoidOutcome(outcome.error()); - } -} - -PutLiveChannelOutcome OssClientImpl::PutLiveChannel(const PutLiveChannelRequest& request) const -{ - auto outcome = MakeRequest(request, Http::Put); - if(outcome.isSuccess()) - { - PutLiveChannelResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone()? - PutLiveChannelOutcome(std::move(result)): - PutLiveChannelOutcome(OssError("PutLiveChannelError", "Parse Error")); - }else{ - return PutLiveChannelOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::PostVodPlaylist(const PostVodPlaylistRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Post); - if(outcome.isSuccess()) - { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(std::move(result)); - }else{ - return VoidOutcome(outcome.error()); - } -} - -GetVodPlaylistOutcome OssClientImpl::GetVodPlaylist(const GetVodPlaylistRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Get); - if(outcome.isSuccess()) - { - GetVodPlaylistResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return GetVodPlaylistOutcome(std::move(result)); - }else{ - return GetVodPlaylistOutcome(outcome.error()); - } -} - -GetLiveChannelStatOutcome OssClientImpl::GetLiveChannelStat(const GetLiveChannelStatRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Get); - if(outcome.isSuccess()) - { - GetLiveChannelStatResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone()? - GetLiveChannelStatOutcome(std::move(result)): - GetLiveChannelStatOutcome(OssError("GetLiveChannelStatError", "Parse Error")); - }else{ - return GetLiveChannelStatOutcome(outcome.error()); - } -} - -GetLiveChannelInfoOutcome OssClientImpl::GetLiveChannelInfo(const GetLiveChannelInfoRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Get); - if(outcome.isSuccess()) - { - GetLiveChannelInfoResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone()? - GetLiveChannelInfoOutcome(std::move(result)): - GetLiveChannelInfoOutcome(OssError("GetLiveChannelStatError", "Parse Error")); - }else{ - return GetLiveChannelInfoOutcome(outcome.error()); - } -} - -GetLiveChannelHistoryOutcome OssClientImpl::GetLiveChannelHistory(const GetLiveChannelHistoryRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Get); - if(outcome.isSuccess()) - { - GetLiveChannelHistoryResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone()? - GetLiveChannelHistoryOutcome(std::move(result)): - GetLiveChannelHistoryOutcome(OssError("GetLiveChannelStatError", "Parse Error")); - }else{ - return GetLiveChannelHistoryOutcome(outcome.error()); - } -} - -ListLiveChannelOutcome OssClientImpl::ListLiveChannel(const ListLiveChannelRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Get); - if(outcome.isSuccess()) - { - ListLiveChannelResult result(outcome.result().payload()); - result.requestId_ = outcome.result().RequestId(); - return result.ParseDone()? - ListLiveChannelOutcome(std::move(result)): - ListLiveChannelOutcome(OssError("GetLiveChannelStatError", "Parse Error")); - }else{ - return ListLiveChannelOutcome(outcome.error()); - } -} - -VoidOutcome OssClientImpl::DeleteLiveChannel(const DeleteLiveChannelRequest &request) const -{ - auto outcome = MakeRequest(request, Http::Delete); - if(outcome.isSuccess()) - { - VoidResult result; - result.requestId_ = outcome.result().RequestId(); - return VoidOutcome(std::move(result)); - }else{ - return VoidOutcome(outcome.error()); - } -} - -StringOutcome OssClientImpl::GenerateRTMPSignedUrl(const GenerateRTMPSignedUrlRequest &request) const -{ - if (!IsValidBucketName(request.bucket_) || - !IsValidChannelName(request.ChannelName()) || - !IsValidPlayListName(request.PlayList()) || - 0 == request.Expires()) { - return StringOutcome(OssError("ValidateError", "The Bucket or ChannelName or " - "PlayListName or Expires is invalid.")); - } - - ParameterCollection parameters; - const Credentials credentials = credentialsProvider_->getCredentials(); - if (!credentials.SessionToken().empty()) { - parameters["security-token"] = credentials.SessionToken(); - } - - parameters = request.Parameters(); - - std::string expireStr; - std::stringstream ss; - ss << request.Expires(); - expireStr = ss.str(); - - SignUtils signUtils(signer_->version()); - auto resource = std::string().append("/").append(request.Bucket()).append("/").append(request.ChannelName()); - signUtils.build(expireStr, resource, parameters); - auto signature = signer_->generate(signUtils.CanonicalString(), credentials.AccessKeySecret()); - parameters["Expires"] = expireStr; - parameters["OSSAccessKeyId"] = credentials.AccessKeyId(); - parameters["Signature"] = signature; - - ss.str(""); - ss << CombineRTMPString(endpoint_, request.bucket_, configuration().isCname, configuration().isPathStyle); - ss << "/live"; - ss << CombinePathString(endpoint_, request.bucket_, request.key_, configuration().isPathStyle); - ss << "?"; - ss << CombineQueryString(parameters); - - return StringOutcome(ss.str()); +VoidOutcome OssClientImpl::PutLiveChannelStatus( + const PutLiveChannelStatusRequest &request) const { + auto outcome = MakeRequest(request, Http::Put); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(result); + } else { + return VoidOutcome(outcome.error()); + } +} + +PutLiveChannelOutcome +OssClientImpl::PutLiveChannel(const PutLiveChannelRequest &request) const { + auto outcome = MakeRequest(request, Http::Put); + if (outcome.isSuccess()) { + PutLiveChannelResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() ? PutLiveChannelOutcome(std::move(result)) + : PutLiveChannelOutcome(OssError( + "PutLiveChannelError", "Parse Error")); + } else { + return PutLiveChannelOutcome(outcome.error()); + } +} + +VoidOutcome +OssClientImpl::PostVodPlaylist(const PostVodPlaylistRequest &request) const { + auto outcome = MakeRequest(request, Http::Post); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(std::move(result)); + } else { + return VoidOutcome(outcome.error()); + } +} + +GetVodPlaylistOutcome +OssClientImpl::GetVodPlaylist(const GetVodPlaylistRequest &request) const { + auto outcome = MakeRequest(request, Http::Get); + if (outcome.isSuccess()) { + GetVodPlaylistResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return GetVodPlaylistOutcome(std::move(result)); + } else { + return GetVodPlaylistOutcome(outcome.error()); + } +} + +GetLiveChannelStatOutcome OssClientImpl::GetLiveChannelStat( + const GetLiveChannelStatRequest &request) const { + auto outcome = MakeRequest(request, Http::Get); + if (outcome.isSuccess()) { + GetLiveChannelStatResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() ? GetLiveChannelStatOutcome(std::move(result)) + : GetLiveChannelStatOutcome(OssError( + "GetLiveChannelStatError", "Parse Error")); + } else { + return GetLiveChannelStatOutcome(outcome.error()); + } +} + +GetLiveChannelInfoOutcome OssClientImpl::GetLiveChannelInfo( + const GetLiveChannelInfoRequest &request) const { + auto outcome = MakeRequest(request, Http::Get); + if (outcome.isSuccess()) { + GetLiveChannelInfoResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() ? GetLiveChannelInfoOutcome(std::move(result)) + : GetLiveChannelInfoOutcome(OssError( + "GetLiveChannelStatError", "Parse Error")); + } else { + return GetLiveChannelInfoOutcome(outcome.error()); + } +} + +GetLiveChannelHistoryOutcome OssClientImpl::GetLiveChannelHistory( + const GetLiveChannelHistoryRequest &request) const { + auto outcome = MakeRequest(request, Http::Get); + if (outcome.isSuccess()) { + GetLiveChannelHistoryResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() ? GetLiveChannelHistoryOutcome(std::move(result)) + : GetLiveChannelHistoryOutcome(OssError( + "GetLiveChannelStatError", "Parse Error")); + } else { + return GetLiveChannelHistoryOutcome(outcome.error()); + } +} + +ListLiveChannelOutcome +OssClientImpl::ListLiveChannel(const ListLiveChannelRequest &request) const { + auto outcome = MakeRequest(request, Http::Get); + if (outcome.isSuccess()) { + ListLiveChannelResult result(outcome.result().payload()); + result.requestId_ = outcome.result().RequestId(); + return result.ParseDone() ? ListLiveChannelOutcome(std::move(result)) + : ListLiveChannelOutcome(OssError( + "GetLiveChannelStatError", "Parse Error")); + } else { + return ListLiveChannelOutcome(outcome.error()); + } +} + +VoidOutcome OssClientImpl::DeleteLiveChannel( + const DeleteLiveChannelRequest &request) const { + auto outcome = MakeRequest(request, Http::Delete); + if (outcome.isSuccess()) { + VoidResult result; + result.requestId_ = outcome.result().RequestId(); + return VoidOutcome(std::move(result)); + } else { + return VoidOutcome(outcome.error()); + } +} + +StringOutcome OssClientImpl::GenerateRTMPSignedUrl( + const GenerateRTMPSignedUrlRequest &request) const { + if (!IsValidBucketName(request.bucket_) || + !IsValidChannelName(request.ChannelName()) || + !IsValidPlayListName(request.PlayList()) || 0 == request.Expires()) { + return StringOutcome(OssError("ValidateError", + "The Bucket or ChannelName or " + "PlayListName or Expires is invalid.")); + } + + ParameterCollection parameters; + const Credentials credentials = credentialsProvider_->getCredentials(); + if (!credentials.SessionToken().empty()) { + parameters["security-token"] = credentials.SessionToken(); + } + + parameters = request.Parameters(); + + std::string expireStr; + std::stringstream ss; + ss << request.Expires(); + expireStr = ss.str(); + + SignUtils signUtils(signer_->version()); + auto resource = std::string() + .append("/") + .append(request.Bucket()) + .append("/") + .append(request.ChannelName()); + signUtils.build(expireStr, resource, parameters); + auto signature = signer_->generate(signUtils.CanonicalString(), + credentials.AccessKeySecret()); + parameters["Expires"] = expireStr; + parameters["OSSAccessKeyId"] = credentials.AccessKeyId(); + parameters["Signature"] = signature; + + ss.str(""); + ss << CombineRTMPString(endpoint_, request.bucket_, configuration().isCname, + configuration().isPathStyle); + ss << "/live"; + ss << CombinePathString(endpoint_, request.bucket_, request.key_, + configuration().isPathStyle); + ss << "?"; + ss << CombineQueryString(parameters); + + return StringOutcome(ss.str()); } #endif /*Requests control*/ -void OssClientImpl::DisableRequest() -{ - BASE::disableRequest(); - OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) DisableRequest", this); +void OssClientImpl::DisableRequest() { + BASE::disableRequest(); + OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) DisableRequest", this); } -void OssClientImpl::EnableRequest() -{ - BASE::enableRequest(); - OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) EnableRequest", this); +void OssClientImpl::EnableRequest() { + BASE::enableRequest(); + OSS_LOG(LogLevel::LogDebug, TAG, "client(%p) EnableRequest", this); } diff --git a/sdk/src/OssClientImpl.h b/sdk/src/OssClientImpl.h index 2c95098..feea6f0 100644 --- a/sdk/src/OssClientImpl.h +++ b/sdk/src/OssClientImpl.h @@ -1,196 +1,271 @@ /* -* Copyright 2009-2017 Alibaba Cloud All rights reserved. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2009-2017 Alibaba Cloud All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #ifndef ALIBABACLOUD_OSS_OSSCLIENTIMPL_H_ #define ALIBABACLOUD_OSS_OSSCLIENTIMPL_H_ -#include -#include +#include "auth/Signer.h" +#include "client/Client.h" +#include #include #include +#include +#include #include -#include -#include "auth/Signer.h" -#include "client/Client.h" +#include + #ifdef GetObject #undef GetObject #endif -namespace AlibabaCloud -{ -namespace OSS -{ - class OssClientImpl : public Client - { - public: - typedef Client BASE; +namespace AlibabaCloud { +namespace OSS { +class OssClientImpl : public Client { +public: + typedef Client BASE; - OssClientImpl(const std::string &endpoint, const std::shared_ptr& credentialsProvider, const ClientConfiguration & configuration); - virtual ~OssClientImpl(); - int asyncExecute(Runnable * r) const; + OssClientImpl(const std::string &endpoint, + const std::shared_ptr &credentialsProvider, + const ClientConfiguration &configuration); + virtual ~OssClientImpl(); + int asyncExecute(Runnable *r) const; #if !defined(OSS_DISABLE_BUCKET) - ListBucketsOutcome ListBuckets(const ListBucketsRequest &request) const; - CreateBucketOutcome CreateBucket(const CreateBucketRequest &request) const; - VoidOutcome SetBucketAcl(const SetBucketAclRequest& request) const; - VoidOutcome SetBucketLogging(const SetBucketLoggingRequest& request) const; - VoidOutcome SetBucketWebsite(const SetBucketWebsiteRequest& request) const; - VoidOutcome SetBucketReferer(const SetBucketRefererRequest& request) const; - VoidOutcome SetBucketLifecycle(const SetBucketLifecycleRequest& request) const; - VoidOutcome SetBucketCors(const SetBucketCorsRequest& request) const; - VoidOutcome SetBucketStorageCapacity(const SetBucketStorageCapacityRequest& request) const; - VoidOutcome SetBucketPolicy(const SetBucketPolicyRequest& request) const; - VoidOutcome SetBucketRequestPayment(const SetBucketRequestPaymentRequest& request) const; - VoidOutcome SetBucketEncryption(const SetBucketEncryptionRequest& request) const; - VoidOutcome SetBucketTagging(const SetBucketTaggingRequest& request) const; - VoidOutcome SetBucketQosInfo(const SetBucketQosInfoRequest& request) const; - VoidOutcome SetBucketVersioning(const SetBucketVersioningRequest& request) const; - VoidOutcome SetBucketInventoryConfiguration(const SetBucketInventoryConfigurationRequest& request) const; - - VoidOutcome DeleteBucket(const DeleteBucketRequest &request) const; - VoidOutcome DeleteBucketLogging(const DeleteBucketLoggingRequest& request) const; - VoidOutcome DeleteBucketWebsite(const DeleteBucketWebsiteRequest& request) const; - VoidOutcome DeleteBucketLifecycle(const DeleteBucketLifecycleRequest& request) const; - VoidOutcome DeleteBucketCors(const DeleteBucketCorsRequest& request) const; - VoidOutcome DeleteBucketPolicy(const DeleteBucketPolicyRequest& request) const; - VoidOutcome DeleteBucketEncryption(const DeleteBucketEncryptionRequest& request) const; - VoidOutcome DeleteBucketTagging(const DeleteBucketTaggingRequest& request) const; - VoidOutcome DeleteBucketQosInfo(const DeleteBucketQosInfoRequest& request) const; - VoidOutcome DeleteBucketInventoryConfiguration(const DeleteBucketInventoryConfigurationRequest& request) const; - - ListBucketInventoryConfigurationsOutcome ListBucketInventoryConfigurations(const ListBucketInventoryConfigurationsRequest& request) const; - - GetBucketAclOutcome GetBucketAcl(const GetBucketAclRequest &request) const; - GetBucketLocationOutcome GetBucketLocation(const GetBucketLocationRequest &request) const; - GetBucketInfoOutcome GetBucketInfo(const GetBucketInfoRequest &request) const; - GetBucketLoggingOutcome GetBucketLogging(const GetBucketLoggingRequest &request) const; - GetBucketWebsiteOutcome GetBucketWebsite(const GetBucketWebsiteRequest &request) const; - GetBucketRefererOutcome GetBucketReferer(const GetBucketRefererRequest &request) const; - GetBucketLifecycleOutcome GetBucketLifecycle(const GetBucketLifecycleRequest &request) const; - GetBucketStatOutcome GetBucketStat(const GetBucketStatRequest &request) const; - GetBucketCorsOutcome GetBucketCors(const GetBucketCorsRequest &request) const; - GetBucketStorageCapacityOutcome GetBucketStorageCapacity(const GetBucketStorageCapacityRequest& request) const; - GetBucketPolicyOutcome GetBucketPolicy(const GetBucketPolicyRequest& request) const; - GetBucketPaymentOutcome GetBucketRequestPayment(const GetBucketRequestPaymentRequest& request) const; - GetBucketEncryptionOutcome GetBucketEncryption(const GetBucketEncryptionRequest& request) const; - GetBucketTaggingOutcome GetBucketTagging(const GetBucketTaggingRequest& request) const; - GetBucketQosInfoOutcome GetBucketQosInfo(const GetBucketQosInfoRequest& request) const; - GetUserQosInfoOutcome GetUserQosInfo(const GetUserQosInfoRequest& request) const; - GetBucketVersioningOutcome GetBucketVersioning(const GetBucketVersioningRequest& request) const; - GetBucketInventoryConfigurationOutcome GetBucketInventoryConfiguration(const GetBucketInventoryConfigurationRequest& request) const; - InitiateBucketWormOutcome InitiateBucketWorm(const InitiateBucketWormRequest& request) const; - VoidOutcome AbortBucketWorm(const AbortBucketWormRequest& request) const; - VoidOutcome CompleteBucketWorm(const CompleteBucketWormRequest& request) const; - VoidOutcome ExtendBucketWormWorm(const ExtendBucketWormRequest& request) const; - GetBucketWormOutcome GetBucketWorm(const GetBucketWormRequest& request) const; + ListBucketsOutcome ListBuckets(const ListBucketsRequest &request) const; + CreateBucketOutcome CreateBucket(const CreateBucketRequest &request) const; +#ifdef USE_CPP20 + async_simple::coro::Lazy + CreateBucketAsync(const CreateBucketRequest &request) const; #endif + VoidOutcome SetBucketAcl(const SetBucketAclRequest &request) const; + VoidOutcome SetBucketLogging(const SetBucketLoggingRequest &request) const; + VoidOutcome SetBucketWebsite(const SetBucketWebsiteRequest &request) const; + VoidOutcome SetBucketReferer(const SetBucketRefererRequest &request) const; + VoidOutcome + SetBucketLifecycle(const SetBucketLifecycleRequest &request) const; + VoidOutcome SetBucketCors(const SetBucketCorsRequest &request) const; + VoidOutcome SetBucketStorageCapacity( + const SetBucketStorageCapacityRequest &request) const; + VoidOutcome SetBucketPolicy(const SetBucketPolicyRequest &request) const; + VoidOutcome + SetBucketRequestPayment(const SetBucketRequestPaymentRequest &request) const; + VoidOutcome + SetBucketEncryption(const SetBucketEncryptionRequest &request) const; + VoidOutcome SetBucketTagging(const SetBucketTaggingRequest &request) const; + VoidOutcome SetBucketQosInfo(const SetBucketQosInfoRequest &request) const; + VoidOutcome + SetBucketVersioning(const SetBucketVersioningRequest &request) const; + VoidOutcome SetBucketInventoryConfiguration( + const SetBucketInventoryConfigurationRequest &request) const; - /*Object*/ - ListObjectOutcome ListObjects(const ListObjectsRequest &request) const; - ListObjectsV2Outcome ListObjectsV2(const ListObjectsV2Request &request) const; - ListObjectVersionsOutcome ListObjectVersions(const ListObjectVersionsRequest &request) const; - - GetObjectOutcome GetObject(const GetObjectRequest &request) const; - PutObjectOutcome PutObject(const PutObjectRequest &request) const; - DeleteObjectOutcome DeleteObject(const DeleteObjectRequest &request) const; - DeleteObjecstOutcome DeleteObjects(const DeleteObjectsRequest &request) const; - DeleteObjecVersionstOutcome DeleteObjectVersions(const DeleteObjectVersionsRequest& request) const; - ObjectMetaDataOutcome HeadObject(const HeadObjectRequest &request) const; - ObjectMetaDataOutcome GetObjectMeta(const GetObjectMetaRequest &request) const; - - GetObjectAclOutcome GetObjectAcl(const GetObjectAclRequest &request) const; - AppendObjectOutcome AppendObject(const AppendObjectRequest &request) const; - CopyObjectOutcome CopyObject(const CopyObjectRequest &request) const; - GetSymlinkOutcome GetSymlink(const GetSymlinkRequest &request) const; - RestoreObjectOutcome RestoreObject(const RestoreObjectRequest &request) const; - CreateSymlinkOutcome CreateSymlink(const CreateSymlinkRequest &request) const; - SetObjectAclOutcome SetObjectAcl(const SetObjectAclRequest &request) const; - GetObjectOutcome ProcessObject(const ProcessObjectRequest &request) const; - - GetObjectOutcome SelectObject(const SelectObjectRequest &request) const; - CreateSelectObjectMetaOutcome CreateSelectObjectMeta(const CreateSelectObjectMetaRequest &request) const; - - SetObjectTaggingOutcome SetObjectTagging(const SetObjectTaggingRequest& request) const; - DeleteObjectTaggingOutcome DeleteObjectTagging(const DeleteObjectTaggingRequest& request) const; - GetObjectTaggingOutcome GetObjectTagging(const GetObjectTaggingRequest& request) const; - - /*MultipartUpload*/ - InitiateMultipartUploadOutcome InitiateMultipartUpload(const InitiateMultipartUploadRequest &request) const; - PutObjectOutcome UploadPart(const UploadPartRequest& request) const; - UploadPartCopyOutcome UploadPartCopy(const UploadPartCopyRequest &request) const; - CompleteMultipartUploadOutcome CompleteMultipartUpload(const CompleteMultipartUploadRequest &request) const; - VoidOutcome AbortMultipartUpload(const AbortMultipartUploadRequest &request) const; - ListMultipartUploadsOutcome ListMultipartUploads(const ListMultipartUploadsRequest &request) const; - ListPartsOutcome ListParts(const ListPartsRequest &request) const; - - /*Generate URL*/ - StringOutcome GeneratePresignedUrl(const GeneratePresignedUrlRequest &request) const; - GetObjectOutcome GetObjectByUrl(const GetObjectByUrlRequest &request) const; - PutObjectOutcome PutObjectByUrl(const PutObjectByUrlRequest &request) const; - - - /*Generate Post Policy*/ + VoidOutcome DeleteBucket(const DeleteBucketRequest &request) const; + VoidOutcome + DeleteBucketLogging(const DeleteBucketLoggingRequest &request) const; + VoidOutcome + DeleteBucketWebsite(const DeleteBucketWebsiteRequest &request) const; + VoidOutcome + DeleteBucketLifecycle(const DeleteBucketLifecycleRequest &request) const; + VoidOutcome DeleteBucketCors(const DeleteBucketCorsRequest &request) const; + VoidOutcome + DeleteBucketPolicy(const DeleteBucketPolicyRequest &request) const; + VoidOutcome + DeleteBucketEncryption(const DeleteBucketEncryptionRequest &request) const; + VoidOutcome + DeleteBucketTagging(const DeleteBucketTaggingRequest &request) const; + VoidOutcome + DeleteBucketQosInfo(const DeleteBucketQosInfoRequest &request) const; + VoidOutcome DeleteBucketInventoryConfiguration( + const DeleteBucketInventoryConfigurationRequest &request) const; + + ListBucketInventoryConfigurationsOutcome ListBucketInventoryConfigurations( + const ListBucketInventoryConfigurationsRequest &request) const; + + GetBucketAclOutcome GetBucketAcl(const GetBucketAclRequest &request) const; + GetBucketLocationOutcome + GetBucketLocation(const GetBucketLocationRequest &request) const; + GetBucketInfoOutcome GetBucketInfo(const GetBucketInfoRequest &request) const; + GetBucketLoggingOutcome + GetBucketLogging(const GetBucketLoggingRequest &request) const; + GetBucketWebsiteOutcome + GetBucketWebsite(const GetBucketWebsiteRequest &request) const; + GetBucketRefererOutcome + GetBucketReferer(const GetBucketRefererRequest &request) const; + GetBucketLifecycleOutcome + GetBucketLifecycle(const GetBucketLifecycleRequest &request) const; + GetBucketStatOutcome GetBucketStat(const GetBucketStatRequest &request) const; + GetBucketCorsOutcome GetBucketCors(const GetBucketCorsRequest &request) const; + GetBucketStorageCapacityOutcome GetBucketStorageCapacity( + const GetBucketStorageCapacityRequest &request) const; + GetBucketPolicyOutcome + GetBucketPolicy(const GetBucketPolicyRequest &request) const; + GetBucketPaymentOutcome + GetBucketRequestPayment(const GetBucketRequestPaymentRequest &request) const; + GetBucketEncryptionOutcome + GetBucketEncryption(const GetBucketEncryptionRequest &request) const; + GetBucketTaggingOutcome + GetBucketTagging(const GetBucketTaggingRequest &request) const; + GetBucketQosInfoOutcome + GetBucketQosInfo(const GetBucketQosInfoRequest &request) const; + GetUserQosInfoOutcome + GetUserQosInfo(const GetUserQosInfoRequest &request) const; + GetBucketVersioningOutcome + GetBucketVersioning(const GetBucketVersioningRequest &request) const; + GetBucketInventoryConfigurationOutcome GetBucketInventoryConfiguration( + const GetBucketInventoryConfigurationRequest &request) const; + InitiateBucketWormOutcome + InitiateBucketWorm(const InitiateBucketWormRequest &request) const; + VoidOutcome AbortBucketWorm(const AbortBucketWormRequest &request) const; + VoidOutcome + CompleteBucketWorm(const CompleteBucketWormRequest &request) const; + VoidOutcome + ExtendBucketWormWorm(const ExtendBucketWormRequest &request) const; + GetBucketWormOutcome GetBucketWorm(const GetBucketWormRequest &request) const; +#endif + + /*Object*/ + ListObjectOutcome ListObjects(const ListObjectsRequest &request) const; + ListObjectsV2Outcome ListObjectsV2(const ListObjectsV2Request &request) const; + ListObjectVersionsOutcome + ListObjectVersions(const ListObjectVersionsRequest &request) const; + + GetObjectOutcome GetObject(const GetObjectRequest &request) const; + PutObjectOutcome PutObject(const PutObjectRequest &request) const; + DeleteObjectOutcome DeleteObject(const DeleteObjectRequest &request) const; + DeleteObjecstOutcome DeleteObjects(const DeleteObjectsRequest &request) const; + DeleteObjecVersionstOutcome + DeleteObjectVersions(const DeleteObjectVersionsRequest &request) const; + ObjectMetaDataOutcome HeadObject(const HeadObjectRequest &request) const; + ObjectMetaDataOutcome + GetObjectMeta(const GetObjectMetaRequest &request) const; + + GetObjectAclOutcome GetObjectAcl(const GetObjectAclRequest &request) const; + AppendObjectOutcome AppendObject(const AppendObjectRequest &request) const; + CopyObjectOutcome CopyObject(const CopyObjectRequest &request) const; + GetSymlinkOutcome GetSymlink(const GetSymlinkRequest &request) const; + RestoreObjectOutcome RestoreObject(const RestoreObjectRequest &request) const; + CreateSymlinkOutcome CreateSymlink(const CreateSymlinkRequest &request) const; + SetObjectAclOutcome SetObjectAcl(const SetObjectAclRequest &request) const; + GetObjectOutcome ProcessObject(const ProcessObjectRequest &request) const; + + GetObjectOutcome SelectObject(const SelectObjectRequest &request) const; + CreateSelectObjectMetaOutcome + CreateSelectObjectMeta(const CreateSelectObjectMetaRequest &request) const; + + SetObjectTaggingOutcome + SetObjectTagging(const SetObjectTaggingRequest &request) const; + DeleteObjectTaggingOutcome + DeleteObjectTagging(const DeleteObjectTaggingRequest &request) const; + GetObjectTaggingOutcome + GetObjectTagging(const GetObjectTaggingRequest &request) const; + + /*MultipartUpload*/ + InitiateMultipartUploadOutcome + InitiateMultipartUpload(const InitiateMultipartUploadRequest &request) const; + PutObjectOutcome UploadPart(const UploadPartRequest &request) const; + UploadPartCopyOutcome + UploadPartCopy(const UploadPartCopyRequest &request) const; + CompleteMultipartUploadOutcome + CompleteMultipartUpload(const CompleteMultipartUploadRequest &request) const; + VoidOutcome + AbortMultipartUpload(const AbortMultipartUploadRequest &request) const; + ListMultipartUploadsOutcome + ListMultipartUploads(const ListMultipartUploadsRequest &request) const; + ListPartsOutcome ListParts(const ListPartsRequest &request) const; + + /*Generate URL*/ + StringOutcome + GeneratePresignedUrl(const GeneratePresignedUrlRequest &request) const; + GetObjectOutcome GetObjectByUrl(const GetObjectByUrlRequest &request) const; + PutObjectOutcome PutObjectByUrl(const PutObjectByUrlRequest &request) const; + + /*Generate Post Policy*/ #if !defined(OSS_DISABLE_RESUAMABLE) - /*Resumable Operation*/ - PutObjectOutcome ResumableUploadObject(const UploadObjectRequest& request) const; - CopyObjectOutcome ResumableCopyObject(const MultiCopyObjectRequest& request) const; - GetObjectOutcome ResumableDownloadObject(const DownloadObjectRequest& request) const; + /*Resumable Operation*/ + PutObjectOutcome + ResumableUploadObject(const UploadObjectRequest &request) const; + CopyObjectOutcome + ResumableCopyObject(const MultiCopyObjectRequest &request) const; + GetObjectOutcome + ResumableDownloadObject(const DownloadObjectRequest &request) const; #endif #if !defined(OSS_DISABLE_LIVECHANNEL) - /*Live Channel*/ - VoidOutcome PutLiveChannelStatus(const PutLiveChannelStatusRequest &request) const; - PutLiveChannelOutcome PutLiveChannel(const PutLiveChannelRequest &request) const; - VoidOutcome PostVodPlaylist(const PostVodPlaylistRequest &request) const; - GetVodPlaylistOutcome GetVodPlaylist(const GetVodPlaylistRequest& request) const; - GetLiveChannelStatOutcome GetLiveChannelStat(const GetLiveChannelStatRequest &request) const; - GetLiveChannelInfoOutcome GetLiveChannelInfo(const GetLiveChannelInfoRequest &request) const; - GetLiveChannelHistoryOutcome GetLiveChannelHistory(const GetLiveChannelHistoryRequest &request) const; - ListLiveChannelOutcome ListLiveChannel(const ListLiveChannelRequest &request) const; - VoidOutcome DeleteLiveChannel(const DeleteLiveChannelRequest &request) const; - StringOutcome GenerateRTMPSignedUrl(const GenerateRTMPSignedUrlRequest &request) const; + /*Live Channel*/ + VoidOutcome + PutLiveChannelStatus(const PutLiveChannelStatusRequest &request) const; + PutLiveChannelOutcome + PutLiveChannel(const PutLiveChannelRequest &request) const; + VoidOutcome PostVodPlaylist(const PostVodPlaylistRequest &request) const; + GetVodPlaylistOutcome + GetVodPlaylist(const GetVodPlaylistRequest &request) const; + GetLiveChannelStatOutcome + GetLiveChannelStat(const GetLiveChannelStatRequest &request) const; + GetLiveChannelInfoOutcome + GetLiveChannelInfo(const GetLiveChannelInfoRequest &request) const; + GetLiveChannelHistoryOutcome + GetLiveChannelHistory(const GetLiveChannelHistoryRequest &request) const; + ListLiveChannelOutcome + ListLiveChannel(const ListLiveChannelRequest &request) const; + VoidOutcome DeleteLiveChannel(const DeleteLiveChannelRequest &request) const; + StringOutcome + GenerateRTMPSignedUrl(const GenerateRTMPSignedUrlRequest &request) const; +#endif + + /*Requests control*/ + void DisableRequest(); + void EnableRequest(); + +protected: + virtual std::shared_ptr + buildHttpRequest(const std::string &endpoint, const ServiceRequest &msg, + Http::Method method) const; + virtual bool + hasResponseError(const std::shared_ptr &response) const; + OssOutcome MakeRequest(const OssRequest &request, Http::Method method) const; +#ifdef USE_CPP20 + async_simple::coro::Lazy + MakeRequestAsync(const OssRequest &request, Http::Method method) const; #endif - /*Requests control*/ - void DisableRequest(); - void EnableRequest(); - - protected: - virtual std::shared_ptr buildHttpRequest(const std::string & endpoint, const ServiceRequest &msg, Http::Method method) const; - virtual bool hasResponseError(const std::shared_ptr&response) const; - OssOutcome MakeRequest(const OssRequest &request, Http::Method method) const; - - private: - void addHeaders(const std::shared_ptr &httpRequest, const HeaderCollection &headers) const; - void addBody(const std::shared_ptr &httpRequest, const std::shared_ptr& body, bool contentMd5 = false) const; - void addSignInfo(const std::shared_ptr &httpRequest, const ServiceRequest &request) const; - void addUrl(const std::shared_ptr &httpRequest, const std::string &endpoint, const ServiceRequest &request) const; - void addOther(const std::shared_ptr &httpRequest, const ServiceRequest &request) const; - - OssError buildError(const Error &error) const; - ServiceResult buildResult(const OssRequest &request, const std::shared_ptr &httpResponse) const; - - private: - std::string endpoint_; - std::shared_ptr credentialsProvider_; - std::shared_ptr signer_; - std::shared_ptr executor_; - bool isValidEndpoint_; - }; -} -} +private: + void addHeaders(const std::shared_ptr &httpRequest, + const HeaderCollection &headers) const; + void addBody(const std::shared_ptr &httpRequest, + const std::shared_ptr &body, + bool contentMd5 = false) const; + void addSignInfo(const std::shared_ptr &httpRequest, + const ServiceRequest &request) const; + void addUrl(const std::shared_ptr &httpRequest, + const std::string &endpoint, const ServiceRequest &request) const; + void addOther(const std::shared_ptr &httpRequest, + const ServiceRequest &request) const; + + OssError buildError(const Error &error) const; + ServiceResult + buildResult(const OssRequest &request, + const std::shared_ptr &httpResponse) const; + +private: + std::string endpoint_; + std::shared_ptr credentialsProvider_; + std::shared_ptr signer_; + std::shared_ptr executor_; + bool isValidEndpoint_; +}; +} // namespace OSS +} // namespace AlibabaCloud #endif // !ALIBABACLOUD_OSS_OSSCLIENTIMPL_H_ diff --git a/sdk/src/client/Client.cc b/sdk/src/client/Client.cc index cbc3290..d25ef22 100644 --- a/sdk/src/client/Client.cc +++ b/sdk/src/client/Client.cc @@ -1,12 +1,12 @@ /* * Copyright 2009-2017 Alibaba Cloud All rights reserved. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -14,161 +14,201 @@ * limitations under the License. */ -#include -#include -#include #include "Client.h" +#include "../auth/Signer.h" +#ifdef USE_CPP20 +#include "../http/CoroHttpClient.hpp" +#endif #include "../http/CurlHttpClient.h" #include "../utils/Utils.h" -#include "../auth/Signer.h" -#include +#include +#include #include - +#include +#include using namespace AlibabaCloud::OSS; using namespace tinyxml2; -Client::Client(const std::string & servicename, const ClientConfiguration &configuration) : - requestDateOffset_(0), - serviceName_(servicename), - configuration_(configuration), - httpClient_(configuration.httpClient? configuration.httpClient:std::make_shared(configuration)) -{ -} - -Client::~Client() -{ +Client::Client(const std::string &servicename, + const ClientConfiguration &configuration) + : requestDateOffset_(0), serviceName_(servicename), + configuration_(configuration) { + configuration.useCoro +#ifdef USE_CPP20 + ? httpClient_ = std::make_shared(configuration) +#else + ? httpClient_ = configuration_.httpClient +#endif + : httpClient_ = std::make_shared(configuration); } -const ClientConfiguration& Client::configuration()const -{ - return configuration_; -} +Client::~Client() {} -std::string Client::serviceName()const -{ - return serviceName_; +const ClientConfiguration &Client::configuration() const { + return configuration_; } -Client::ClientOutcome Client::AttemptRequest(const std::string & endpoint, const ServiceRequest & request, Http::Method method) const -{ - for (int retry =0; ;retry++) { - auto outcome = AttemptOnceRequest(endpoint, request, method); - if (outcome.isSuccess()) { - return outcome; - } - else if (!httpClient_->isEnable()) { - return outcome; - } - else { - if (configuration_.enableDateSkewAdjustment && - outcome.error().Status() == 403 && - outcome.error().Message().find("RequestTimeTooSkewed")) { - auto serverTimeStr = analyzeServerTime(outcome.error().Message()); - auto serverTime = UtcToUnixTime(serverTimeStr); - if (serverTime != -1) { - std::time_t localTime = std::time(nullptr); - setRequestDateOffset(serverTime - localTime); - } - } - RetryStrategy *retryStrategy = configuration().retryStrategy.get(); - if (retryStrategy == nullptr || !retryStrategy->shouldRetry(outcome.error(), retry)) { - return outcome; - } - long sleepTmeMs = retryStrategy->calcDelayTimeMs(outcome.error(), retry); - httpClient_->waitForRetry(sleepTmeMs); +std::string Client::serviceName() const { return serviceName_; } + +Client::ClientOutcome Client::AttemptRequest(const std::string &endpoint, + const ServiceRequest &request, + Http::Method method) const { + for (int retry = 0;; retry++) { + auto outcome = AttemptOnceRequest(endpoint, request, method); + if (outcome.isSuccess()) { + return outcome; + } else if (!httpClient_->isEnable()) { + return outcome; + } else { + if (configuration_.enableDateSkewAdjustment && + outcome.error().Status() == 403 && + outcome.error().Message().find("RequestTimeTooSkewed")) { + auto serverTimeStr = analyzeServerTime(outcome.error().Message()); + auto serverTime = UtcToUnixTime(serverTimeStr); + if (serverTime != -1) { + std::time_t localTime = std::time(nullptr); + setRequestDateOffset(serverTime - localTime); } + } + RetryStrategy *retryStrategy = configuration().retryStrategy.get(); + if (retryStrategy == nullptr || + !retryStrategy->shouldRetry(outcome.error(), retry)) { + return outcome; + } + long sleepTmeMs = retryStrategy->calcDelayTimeMs(outcome.error(), retry); + httpClient_->waitForRetry(sleepTmeMs); } + } } -Client::ClientOutcome Client::AttemptOnceRequest(const std::string & endpoint, const ServiceRequest & request, Http::Method method) const -{ - if (!httpClient_->isEnable()) { - return ClientOutcome(Error("ClientError:100002", "Disable all requests by upper.")); - } - - auto r = buildHttpRequest(endpoint, request, method); - auto response = httpClient_->makeRequest(r); - - if(hasResponseError(response)) { - return ClientOutcome(buildError(response)); - } else { - return ClientOutcome(response); - } +Client::ClientOutcome Client::AttemptOnceRequest(const std::string &endpoint, + const ServiceRequest &request, + Http::Method method) const { + if (!httpClient_->isEnable()) { + return ClientOutcome( + Error("ClientError:100002", "Disable all requests by upper.")); + } + + auto r = buildHttpRequest(endpoint, request, method); + auto response = httpClient_->makeRequest(r); + + if (hasResponseError(response)) { + return ClientOutcome(buildError(response)); + } else { + return ClientOutcome(response); + } } -std::string Client::analyzeServerTime(const std::string &message) const -{ - XMLDocument doc; - if (doc.Parse(message.c_str(), message.size()) == XML_SUCCESS) { - XMLElement* root = doc.RootElement(); - if (root && !std::strncmp("Error", root->Name(), 5)) { - XMLElement *node; - node = root->FirstChildElement("ServerTime"); - return (node ? node->GetText() : ""); +#ifdef USE_CPP20 +async_simple::coro::Lazy +Client::AttemptRequestAsync(const std::string &endpoint, + const ServiceRequest &request, + Http::Method method) const { + for (int retry = 0;; retry++) { + auto outcome = co_await AttemptOnceRequestAsync(endpoint, request, method); + if (outcome.isSuccess()) { + co_return outcome; + } else if (!httpClient_->isEnable()) { + co_return outcome; + } else { + if (configuration_.enableDateSkewAdjustment && + outcome.error().Status() == 403 && + outcome.error().Message().find("RequestTimeTooSkewed")) { + auto serverTimeStr = analyzeServerTime(outcome.error().Message()); + auto serverTime = UtcToUnixTime(serverTimeStr); + if (serverTime != -1) { + std::time_t localTime = std::time(nullptr); + setRequestDateOffset(serverTime - localTime); } + } + RetryStrategy *retryStrategy = configuration().retryStrategy.get(); + if (retryStrategy == nullptr || + !retryStrategy->shouldRetry(outcome.error(), retry)) { + co_return outcome; + } + long sleepTmeMs = retryStrategy->calcDelayTimeMs(outcome.error(), retry); + httpClient_->waitForRetry(sleepTmeMs); } - return ""; + } } -Error Client::buildError(const std::shared_ptr &response) const -{ - Error error; - if (response == nullptr) { - error.setCode("NullptrError"); - error.setMessage("HttpResponse is nullptr, should not be here."); - return error; - } - - long responseCode = response->statusCode(); - error.setStatus(responseCode); - std::stringstream ss; - if ((responseCode == 203) || - (responseCode > 299 && responseCode < 600)) { - ss << "ServerError:" << responseCode; - error.setCode(ss.str()); - if (response->Body() != nullptr) { - std::istreambuf_iterator isb(*response->Body().get()), end; - error.setMessage(std::string(isb, end)); - } - } else { - ss << "ClientError:" << responseCode; - error.setCode(ss.str()); - error.setMessage(response->statusMsg()); +async_simple::coro::Lazy +Client::AttemptOnceRequestAsync(const std::string &endpoint, + const ServiceRequest &request, + Http::Method method) const { + if (!httpClient_->isEnable()) { + co_return ClientOutcome( + Error("ClientError:100002", "Disable all requests by upper.")); + } + + auto r = buildHttpRequest(endpoint, request, method); + auto response = co_await httpClient_->makeRequestAsync(r); + + if (hasResponseError(response)) { + co_return ClientOutcome(buildError(response)); + } else { + co_return ClientOutcome(response); + } +} +#endif + +std::string Client::analyzeServerTime(const std::string &message) const { + XMLDocument doc; + if (doc.Parse(message.c_str(), message.size()) == XML_SUCCESS) { + XMLElement *root = doc.RootElement(); + if (root && !std::strncmp("Error", root->Name(), 5)) { + XMLElement *node; + node = root->FirstChildElement("ServerTime"); + return (node ? node->GetText() : ""); } - error.setHeaders(response->Headers()); - return error; + } + return ""; } -bool Client::hasResponseError(const std::shared_ptr&response)const -{ - if (!response) { - return true; +Error Client::buildError(const std::shared_ptr &response) const { + Error error; + if (response == nullptr) { + error.setCode("NullptrError"); + error.setMessage("HttpResponse is nullptr, should not be here."); + return error; + } + + long responseCode = response->statusCode(); + error.setStatus(responseCode); + std::stringstream ss; + if ((responseCode == 203) || (responseCode > 299 && responseCode < 600)) { + ss << "ServerError:" << responseCode; + error.setCode(ss.str()); + if (response->Body() != nullptr) { + std::istreambuf_iterator isb(*response->Body().get()), end; + error.setMessage(std::string(isb, end)); } - return (response->statusCode()/100 != 2); + } else { + ss << "ClientError:" << responseCode; + error.setCode(ss.str()); + error.setMessage(response->statusMsg()); + } + error.setHeaders(response->Headers()); + return error; } -void Client::disableRequest() -{ - httpClient_->disable(); +bool Client::hasResponseError( + const std::shared_ptr &response) const { + if (!response) { + return true; + } + return (response->statusCode() / 100 != 2); } -void Client::enableRequest() -{ - httpClient_->enable(); -} +void Client::disableRequest() { httpClient_->disable(); } -bool Client::isEnableRequest() const -{ - return httpClient_->isEnable(); -} - -void Client::setRequestDateOffset(uint64_t offset) const -{ - requestDateOffset_ = offset; +void Client::enableRequest() { httpClient_->enable(); } + +bool Client::isEnableRequest() const { return httpClient_->isEnable(); } + +void Client::setRequestDateOffset(uint64_t offset) const { + requestDateOffset_ = offset; } -uint64_t Client::getRequestDateOffset() const -{ - return requestDateOffset_; -} \ No newline at end of file +uint64_t Client::getRequestDateOffset() const { return requestDateOffset_; } \ No newline at end of file diff --git a/sdk/src/client/Client.h b/sdk/src/client/Client.h index 50add74..ca8a362 100644 --- a/sdk/src/client/Client.h +++ b/sdk/src/client/Client.h @@ -1,12 +1,12 @@ /* * Copyright 2009-2017 Alibaba Cloud All rights reserved. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -16,52 +16,69 @@ #pragma once -#include -#include #include #include #include #include -#include #include +#include +#include +#include +#include + +namespace AlibabaCloud { +namespace OSS { + +class Client { +public: + using ClientOutcome = Outcome>; + + Client(const std::string &servicename, + const ClientConfiguration &configuration); + virtual ~Client(); -namespace AlibabaCloud -{ -namespace OSS -{ + std::string serviceName() const; + const ClientConfiguration &configuration() const; - class Client - { - public: - using ClientOutcome = Outcome> ; + bool isEnableRequest() const; - Client(const std::string & servicename, const ClientConfiguration &configuration); - virtual ~Client(); +protected: +#ifdef USE_CPP20 + async_simple::coro::Lazy + AttemptRequestAsync(const std::string &endpoint, + const ServiceRequest &request, Http::Method method) const; + async_simple::coro::Lazy + AttemptOnceRequestAsync(const std::string &endpoint, + const ServiceRequest &request, + Http::Method method) const; +#endif - std::string serviceName()const; - const ClientConfiguration &configuration()const; + ClientOutcome AttemptRequest(const std::string &endpoint, + const ServiceRequest &request, + Http::Method method) const; + ClientOutcome AttemptOnceRequest(const std::string &endpoint, + const ServiceRequest &request, + Http::Method method) const; + virtual std::shared_ptr + buildHttpRequest(const std::string &endpoint, const ServiceRequest &msg, + Http::Method method) const = 0; + virtual bool + hasResponseError(const std::shared_ptr &response) const; - bool isEnableRequest() const; + void setRequestDateOffset(uint64_t offset) const; + uint64_t getRequestDateOffset() const; - protected: - ClientOutcome AttemptRequest(const std::string & endpoint, const ServiceRequest &request, Http::Method method) const; - ClientOutcome AttemptOnceRequest(const std::string & endpoint, const ServiceRequest &request, Http::Method method) const; - virtual std::shared_ptr buildHttpRequest(const std::string & endpoint, const ServiceRequest &msg, Http::Method method) const = 0; - virtual bool hasResponseError(const std::shared_ptr&response) const; - - void setRequestDateOffset(uint64_t offset) const; - uint64_t getRequestDateOffset() const; + void disableRequest(); + void enableRequest(); - void disableRequest(); - void enableRequest(); - private: - Error buildError(const std::shared_ptr &response) const ; - std::string analyzeServerTime(const std::string &message) const; +private: + Error buildError(const std::shared_ptr &response) const; + std::string analyzeServerTime(const std::string &message) const; - mutable uint64_t requestDateOffset_; - std::string serviceName_; - ClientConfiguration configuration_; - std::shared_ptr httpClient_; - }; -} -} + mutable uint64_t requestDateOffset_; + std::string serviceName_; + ClientConfiguration configuration_; + std::shared_ptr httpClient_; +}; +} // namespace OSS +} // namespace AlibabaCloud diff --git a/sdk/src/http/CoroHttpClient.hpp b/sdk/src/http/CoroHttpClient.hpp new file mode 100644 index 0000000..21e43c7 --- /dev/null +++ b/sdk/src/http/CoroHttpClient.hpp @@ -0,0 +1,74 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace AlibabaCloud::OSS { +class CoroHttpClient : public HttpClient { +public: + CoroHttpClient(const ClientConfiguration &) : HttpClient() {} + ~CoroHttpClient() {} + + virtual std::shared_ptr + makeRequest(const std::shared_ptr &request) override { + std::cout << request->method() << "\n"; + // size_t content_len = 0; + auto &headers = request->Headers(); + for (auto &[k, v] : headers) { + if (k == "Content-Length") { + // content_len = atoi(v.data()); + } + client_.add_header(k, v); + } + + // auto body = request->Body(); + // std::string str; + // str.resize(content_len); + // body->read(str.data(), content_len); + // std::ofstream file("temp.xml", std::ios::binary); + // file.write(str.data(), str.size()); + // file.close(); + + return async_simple::coro::syncAwait(makeRequestAsync(request)); + } + + virtual async_simple::coro::Lazy> + makeRequestAsync(const std::shared_ptr &request) override { + auto url = request->url(); + std::string str_url; + str_url.append(url.scheme()) + .append("://") + .append(url.host()) + .append(url.path()); + + // auto result = co_await client_.async_upload_chunked( + // str_url, coro_http::http_method::PUT, "temp.xml", + // coro_http::req_content_type::xml); + // std::cout << result.status << "\n"; + // std::cout << result.resp_body << "\n"; + + auto result = co_await client_.async_upload_chunked( + str_url, coro_http::http_method::PUT, request->Body(), + coro_http::req_content_type::xml); + std::cout << result.status << "\n"; + std::cout << result.resp_body << "\n"; + + auto response = std::make_shared(request); + response->setStatusCode(result.status); + + for (auto [k, v] : result.resp_headers) { + std::cout << k << ": " << v << "\n"; + response->setHeader(std::string(k), std::string(v)); + } + + co_return response; + } + +private: + coro_http::coro_http_client client_; +}; +} // namespace AlibabaCloud::OSS \ No newline at end of file diff --git a/sdk/src/http/HttpClient.cc b/sdk/src/http/HttpClient.cc index 77d63bb..7e8b3b3 100644 --- a/sdk/src/http/HttpClient.cc +++ b/sdk/src/http/HttpClient.cc @@ -1,54 +1,39 @@ /* * Copyright 2009-2017 Alibaba Cloud All rights reserved. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ - #include - using namespace AlibabaCloud::OSS; -HttpClient::HttpClient(): - disable_(false) -{ -} +HttpClient::HttpClient() : disable_(false) {} -HttpClient::~HttpClient() -{ -} +HttpClient::~HttpClient() {} -bool HttpClient::isEnable() -{ - return disable_.load() == false; -} +bool HttpClient::isEnable() { return disable_.load() == false; } -void HttpClient::disable() -{ - disable_ = true; - requestSignal_.notify_all(); +void HttpClient::disable() { + disable_ = true; + requestSignal_.notify_all(); } -void HttpClient::enable() -{ - disable_ = false; -} +void HttpClient::enable() { disable_ = false; } -void HttpClient::waitForRetry(long milliseconds) -{ - if (milliseconds == 0) - return; - std::unique_lock lck(requestLock_); - requestSignal_.wait_for(lck, std::chrono::milliseconds(milliseconds), [this] ()-> bool { return disable_.load() == true; }); +void HttpClient::waitForRetry(long milliseconds) { + if (milliseconds == 0) + return; + std::unique_lock lck(requestLock_); + requestSignal_.wait_for(lck, std::chrono::milliseconds(milliseconds), + [this]() -> bool { return disable_.load() == true; }); } - diff --git a/sdk/src/model/SelectObjectRequest.cc b/sdk/src/model/SelectObjectRequest.cc index d57c729..481b366 100644 --- a/sdk/src/model/SelectObjectRequest.cc +++ b/sdk/src/model/SelectObjectRequest.cc @@ -14,329 +14,318 @@ * limitations under the License. */ +#include "../utils/Crc32.h" +#include "../utils/LogUtils.h" +#include "../utils/StreamBuf.h" +#include "../utils/Utils.h" +#include "ModelError.h" #include +#include #include #include -#include -#include "ModelError.h" -#include "../utils/Utils.h" -#include "../utils/LogUtils.h" -#include "../utils/Crc32.h" -#include "../utils/StreamBuf.h" -#define FRAME_HEADER_LEN (12+8) +#define FRAME_HEADER_LEN (12 + 8) using namespace AlibabaCloud::OSS; - struct SelectObjectFrame { - int frame_type; - int init_crc32; - int32_t header_len; - int32_t tail_len; - int32_t payload_remains; - uint8_t tail[4]; - uint8_t header[FRAME_HEADER_LEN]; - uint8_t end_frame[256]; - uint32_t end_frame_size; - uint32_t payload_crc32; + int frame_type; + int init_crc32; + int32_t header_len; + int32_t tail_len; + int32_t payload_remains; + uint8_t tail[4]; + uint8_t header[FRAME_HEADER_LEN]; + uint8_t end_frame[256]; + uint32_t end_frame_size; + uint32_t payload_crc32; }; - -class SelectObjectStreamBuf : public StreamBufProxy -{ +class SelectObjectStreamBuf : public StreamBufProxy { public: - SelectObjectStreamBuf(std::iostream& stream, int initCrc32) : - StreamBufProxy(stream), - lastStatus_(0) - { - // init frame - frame_.init_crc32 = initCrc32; - frame_.header_len = 0; - frame_.tail_len = 0; - frame_.payload_remains = 0; - frame_.end_frame_size = 0; - }; - - int LastStatus() - { - return lastStatus_; - } + SelectObjectStreamBuf(std::iostream &stream, int initCrc32) + : StreamBufProxy(stream), lastStatus_(0) { + // init frame + frame_.init_crc32 = initCrc32; + frame_.header_len = 0; + frame_.tail_len = 0; + frame_.payload_remains = 0; + frame_.end_frame_size = 0; + }; + + int LastStatus() { return lastStatus_; } protected: - int selectObjectDepackFrame(const char *ptr, int len, int *frame_type, int *payload_len, char **payload_buf, SelectObjectFrame *frame) - { - int remain = len; - //Version | Frame - Type | Payload Length | Header Checksum | Payload | Payload Checksum - //<1 byte> <--3 bytes--> <-- 4 bytes --> <------4 bytes--> <----4bytes------> - //Payload - // - //<8 types> + int selectObjectDepackFrame(const char *ptr, int len, int *frame_type, + int *payload_len, char **payload_buf, + SelectObjectFrame *frame) { + int remain = len; + // Version | Frame - Type | Payload Length | Header Checksum | Payload | + // Payload Checksum <1 byte> <--3 bytes--> <-- 4 bytes --> <------4 + //bytes--> <----4bytes------> Payload <8 + //types> + + // header + if (frame->header_len < FRAME_HEADER_LEN) { + int copy = FRAME_HEADER_LEN - frame->header_len; + copy = ((remain > copy) ? copy : remain); + memcpy(frame->header + frame->header_len, ptr, copy); + frame->header_len += copy; + ptr += copy; + remain -= copy; + + // if deal with header done + if (frame->header_len == FRAME_HEADER_LEN) { + uint32_t payload_length; + // calculation payload length + payload_length = frame->header[4]; + payload_length = (payload_length << 8) | frame->header[5]; + payload_length = (payload_length << 8) | frame->header[6]; + payload_length = (payload_length << 8) | frame->header[7]; + frame->payload_remains = payload_length - 8; + frame->payload_crc32 = + CRC32::CalcCRC(frame->init_crc32, frame->header + 12, 8); + } + } - // header - if (frame->header_len < FRAME_HEADER_LEN) { - int copy = FRAME_HEADER_LEN - frame->header_len; - copy = ((remain > copy) ? copy : remain); - memcpy(frame->header + frame->header_len, ptr, copy); - frame->header_len += copy; - ptr += copy; - remain -= copy; + // payload + if (frame->payload_remains > 0) { + int copy = + (frame->payload_remains > remain) ? remain : frame->payload_remains; + uint32_t type; + type = frame->header[1]; + type = (type << 8) | frame->header[2]; + type = (type << 8) | frame->header[3]; + *frame_type = type; + *payload_len = copy; + *payload_buf = (char *)ptr; + remain -= copy; + frame->payload_remains -= copy; + frame->payload_crc32 = CRC32::CalcCRC(frame->payload_crc32, ptr, copy); + return len - remain; + } - // if deal with header done - if (frame->header_len == FRAME_HEADER_LEN) { - uint32_t payload_length; - // calculation payload length - payload_length = frame->header[4]; - payload_length = (payload_length << 8) | frame->header[5]; - payload_length = (payload_length << 8) | frame->header[6]; - payload_length = (payload_length << 8) | frame->header[7]; - frame->payload_remains = payload_length - 8; - frame->payload_crc32 = CRC32::CalcCRC(frame->init_crc32, frame->header + 12, 8); - } - } + // tail + if (frame->tail_len < 4) { + int copy = 4 - frame->tail_len; + copy = (copy > remain ? remain : copy); + memcpy(frame->tail + frame->tail_len, ptr, copy); + frame->tail_len += copy; + remain -= copy; + *frame_type = 0; + } - // payload - if (frame->payload_remains > 0) { - int copy = (frame->payload_remains > remain) ? remain : frame->payload_remains; - uint32_t type; - type = frame->header[1]; - type = (type << 8) | frame->header[2]; - type = (type << 8) | frame->header[3]; - *frame_type = type; - *payload_len = copy; - *payload_buf = (char *)ptr; - remain -= copy; - frame->payload_remains -= copy; - frame->payload_crc32 = CRC32::CalcCRC(frame->payload_crc32, ptr, copy); - return len - remain; + return len - remain; + } + + int selectObjectTransferContent(SelectObjectFrame *frame, const char *ptr, + int wanted) { + int remain = wanted; + char *payload_buf; + // the actual length of the write + int result = 0; + // deal with the whole buffer + while (remain > 0) { + int frame_type = 0, payload_len = 0; + int ret = selectObjectDepackFrame(ptr, remain, &frame_type, &payload_len, + &payload_buf, frame); + switch (frame_type) { + case 0x800001: + int temp; + temp = + static_cast(StreamBufProxy::xsputn(payload_buf, payload_len)); + if (temp < 0) { + return temp; } - - // tail - if (frame->tail_len < 4) { - int copy = 4 - frame->tail_len; - copy = (copy > remain ? remain : copy); - memcpy(frame->tail + frame->tail_len, ptr, copy); - frame->tail_len += copy; - remain -= copy; - *frame_type = 0; + result += temp; + break; + case 0x800004: // Continuous Frame + break; + case 0x800005: // Select object End Frame + { + int32_t copy = sizeof(frame->end_frame) - frame->end_frame_size; + copy = (copy > payload_len) ? payload_len : copy; + if (copy > 0) { + memcpy(frame->end_frame + frame->end_frame_size, ptr, copy); + frame->end_frame_size += copy; } - - return len - remain; - } - - int selectObjectTransferContent(SelectObjectFrame *frame, const char *ptr, int wanted) { - int remain = wanted; - char *payload_buf; - // the actual length of the write - int result = 0; - // deal with the whole buffer - while (remain > 0) { - int frame_type = 0, payload_len = 0; - int ret = selectObjectDepackFrame(ptr, remain, &frame_type, &payload_len, &payload_buf, frame); - switch (frame_type) - { - case 0x800001: - int temp; - temp = static_cast(StreamBufProxy::xsputn(payload_buf, payload_len)); - if (temp < 0) { - return temp; - } - result += temp; - break; - case 0x800004: //Continuous Frame - break; - case 0x800005: //Select object End Frame - { - int32_t copy = sizeof(frame->end_frame) - frame->end_frame_size; - copy = (copy > payload_len) ? payload_len : copy; - if (copy > 0) { - memcpy(frame->end_frame + frame->end_frame_size, ptr, copy); - frame->end_frame_size += copy; - } - } - break; - default: - // get payload checksum - if (frame->tail_len == 4) { - // compare check sum - uint32_t payload_crc32; - payload_crc32 = frame->tail[0]; - payload_crc32 = (payload_crc32 << 8) | frame->tail[1]; - payload_crc32 = (payload_crc32 << 8) | frame->tail[2]; - payload_crc32 = (payload_crc32 << 8) | frame->tail[3]; - if (payload_crc32 != 0 && payload_crc32 != frame->payload_crc32) { - // CRC32 Checksum failed - return -1; - } - - // reset to get next frame - frame->header_len = 0; - frame->tail_len = 0; - frame->payload_remains = 0; - frame->end_frame_size = 0; - } - break; - } - ptr += ret; - remain -= ret; + } break; + default: + // get payload checksum + if (frame->tail_len == 4) { + // compare check sum + uint32_t payload_crc32; + payload_crc32 = frame->tail[0]; + payload_crc32 = (payload_crc32 << 8) | frame->tail[1]; + payload_crc32 = (payload_crc32 << 8) | frame->tail[2]; + payload_crc32 = (payload_crc32 << 8) | frame->tail[3]; + if (payload_crc32 != 0 && payload_crc32 != frame->payload_crc32) { + // CRC32 Checksum failed + return -1; + } + + // reset to get next frame + frame->header_len = 0; + frame->tail_len = 0; + frame->payload_remains = 0; + frame->end_frame_size = 0; } - return result; + break; + } + ptr += ret; + remain -= ret; } - - std::streamsize xsputn(const char *ptr, std::streamsize count) - { - int result = selectObjectTransferContent(&frame_, ptr, static_cast(count)); - if (result < 0) { - if (result == -1) { - lastStatus_ = ARG_ERROR_SELECT_OBJECT_CHECK_SUM_FAILED; - } - return static_cast(result); - } - return count; + return result; + } + + std::streamsize xsputn(const char *ptr, std::streamsize count) { + int result = + selectObjectTransferContent(&frame_, ptr, static_cast(count)); + if (result < 0) { + if (result == -1) { + lastStatus_ = ARG_ERROR_SELECT_OBJECT_CHECK_SUM_FAILED; + } + return static_cast(result); } + return count; + } private: - SelectObjectFrame frame_; - int lastStatus_; + SelectObjectFrame frame_; + int lastStatus_; }; ///////////////////////////////////////////////////////////// -SelectObjectRequest::SelectObjectRequest(const std::string& bucket, const std::string& key) : - GetObjectRequest(bucket, key), - expressionType_(ExpressionType::SQL), - skipPartialDataRecord_(false), - maxSkippedRecordsAllowed_(0), - inputFormat_(nullptr), - outputFormat_(nullptr), - streamBuffer_(nullptr), - upperContent_(nullptr) -{ - setResponseStreamFactory(ResponseStreamFactory()); - - // close CRC Checksum - int flag = Flags(); - flag |= REQUEST_FLAG_CONTENTMD5; - flag &= ~REQUEST_FLAG_CHECK_CRC64; - setFlags(flag); +SelectObjectRequest::SelectObjectRequest(const std::string &bucket, + const std::string &key) + : GetObjectRequest(bucket, key), expressionType_(ExpressionType::SQL), + skipPartialDataRecord_(false), maxSkippedRecordsAllowed_(0), + inputFormat_(nullptr), outputFormat_(nullptr), streamBuffer_(nullptr), + upperContent_(nullptr) { + setResponseStreamFactory(ResponseStreamFactory()); + + // close CRC Checksum + int flag = Flags(); + flag |= REQUEST_FLAG_CONTENTMD5; + flag &= ~REQUEST_FLAG_CHECK_CRC64; + setFlags(flag); } -void SelectObjectRequest::setResponseStreamFactory(const IOStreamFactory& factory) -{ - upperResponseStreamFactory_ = factory; - ServiceRequest::setResponseStreamFactory([=]() { - streamBuffer_ = nullptr; - auto content = upperResponseStreamFactory_(); - if (!outputFormat_->OutputRawData()) { - int initCrc32 = 0; +void SelectObjectRequest::setResponseStreamFactory( + const IOStreamFactory &factory) { + upperResponseStreamFactory_ = factory; + ServiceRequest::setResponseStreamFactory([this]() { + streamBuffer_ = nullptr; + auto content = upperResponseStreamFactory_(); + if (!outputFormat_->OutputRawData()) { + int initCrc32 = 0; #ifdef ENABLE_OSS_TEST - if (!!(Flags() & 0x20000000)) { - const char* TAG = "SelectObjectClient"; - OSS_LOG(LogLevel::LogDebug, TAG, "Payload checksum fail."); - initCrc32 = 1; - } + if (!!(Flags() & 0x20000000)) { + const char *TAG = "SelectObjectClient"; + OSS_LOG(LogLevel::LogDebug, TAG, "Payload checksum fail."); + initCrc32 = 1; + } #endif // ENABLE_OSS_TEST - streamBuffer_ = std::make_shared(*content, initCrc32); - } - upperContent_ = content; - return content; - }); + streamBuffer_ = + std::make_shared(*content, initCrc32); + } + upperContent_ = content; + return content; + }); } -uint64_t SelectObjectRequest::MaxSkippedRecordsAllowed() const -{ - return maxSkippedRecordsAllowed_; +uint64_t SelectObjectRequest::MaxSkippedRecordsAllowed() const { + return maxSkippedRecordsAllowed_; } -void SelectObjectRequest::setSkippedRecords(bool skipPartialDataRecord, uint64_t maxSkippedRecords) -{ - skipPartialDataRecord_ = skipPartialDataRecord; - maxSkippedRecordsAllowed_ = maxSkippedRecords; +void SelectObjectRequest::setSkippedRecords(bool skipPartialDataRecord, + uint64_t maxSkippedRecords) { + skipPartialDataRecord_ = skipPartialDataRecord; + maxSkippedRecordsAllowed_ = maxSkippedRecords; } -void SelectObjectRequest::setExpression(const std::string& expression, ExpressionType type) -{ - expressionType_ = type; - expression_ = expression; +void SelectObjectRequest::setExpression(const std::string &expression, + ExpressionType type) { + expressionType_ = type; + expression_ = expression; } -void SelectObjectRequest::setInputFormat(InputFormat& inputFormat) -{ - inputFormat_ = &inputFormat; +void SelectObjectRequest::setInputFormat(InputFormat &inputFormat) { + inputFormat_ = &inputFormat; } -void SelectObjectRequest::setOutputFormat(OutputFormat& OutputFormat) -{ - outputFormat_ = &OutputFormat; +void SelectObjectRequest::setOutputFormat(OutputFormat &OutputFormat) { + outputFormat_ = &OutputFormat; } -int SelectObjectRequest::validate() const -{ - int ret = GetObjectRequest::validate(); - if (ret != 0) { - return ret; - } +int SelectObjectRequest::validate() const { + int ret = GetObjectRequest::validate(); + if (ret != 0) { + return ret; + } - if (expressionType_ != ExpressionType::SQL) { - return ARG_ERROR_SELECT_OBJECT_NOT_SQL_EXPRESSION; - } - if (inputFormat_ == nullptr || outputFormat_ == nullptr) { - return ARG_ERROR_SELECT_OBJECT_NULL_POINT; - } + if (expressionType_ != ExpressionType::SQL) { + return ARG_ERROR_SELECT_OBJECT_NOT_SQL_EXPRESSION; + } + if (inputFormat_ == nullptr || outputFormat_ == nullptr) { + return ARG_ERROR_SELECT_OBJECT_NULL_POINT; + } - ret = inputFormat_->validate(); - if (ret != 0) { - return ret; - } - ret = outputFormat_->validate(); - if (ret != 0) { - return ret; - } - // check type - if (inputFormat_->Type() != outputFormat_->Type()) { - return ARG_ERROR_SELECT_OBJECT_PROCESS_NOT_SAME; - } - return 0; + ret = inputFormat_->validate(); + if (ret != 0) { + return ret; + } + ret = outputFormat_->validate(); + if (ret != 0) { + return ret; + } + // check type + if (inputFormat_->Type() != outputFormat_->Type()) { + return ARG_ERROR_SELECT_OBJECT_PROCESS_NOT_SAME; + } + return 0; } -std::string SelectObjectRequest::payload() const -{ - std::stringstream ss; - ss << "" << std::endl; - // Expression - ss << "" << Base64Encode(expression_) << "" << std::endl; - // input format - ss << inputFormat_->toXML(1) << std::endl; - // output format - ss << outputFormat_->toXML() << std::endl; - // options - ss << "" << std::endl; - ss << "" << (skipPartialDataRecord_ ? "true" : "false") << "" << std::endl; - ss << "" << std::to_string(MaxSkippedRecordsAllowed()) << "" << std::endl; - ss << "" << std::endl; - ss << "" << std::endl; - return ss.str(); +std::string SelectObjectRequest::payload() const { + std::stringstream ss; + ss << "" << std::endl; + // Expression + ss << "" << Base64Encode(expression_) << "" + << std::endl; + // input format + ss << inputFormat_->toXML(1) << std::endl; + // output format + ss << outputFormat_->toXML() << std::endl; + // options + ss << "" << std::endl; + ss << "" << (skipPartialDataRecord_ ? "true" : "false") + << "" << std::endl; + ss << "" + << std::to_string(MaxSkippedRecordsAllowed()) + << "" << std::endl; + ss << "" << std::endl; + ss << "" << std::endl; + return ss.str(); } -int SelectObjectRequest::dispose() const -{ - int ret = 0; - if (streamBuffer_ != nullptr) { - auto buf = std::static_pointer_cast(streamBuffer_); - ret = buf->LastStatus(); - streamBuffer_ = nullptr; - } - upperContent_ = nullptr; - return ret; +int SelectObjectRequest::dispose() const { + int ret = 0; + if (streamBuffer_ != nullptr) { + auto buf = std::static_pointer_cast(streamBuffer_); + ret = buf->LastStatus(); + streamBuffer_ = nullptr; + } + upperContent_ = nullptr; + return ret; } -ParameterCollection SelectObjectRequest::specialParameters() const -{ - auto parameters = GetObjectRequest::specialParameters(); - if (inputFormat_) { - auto type = inputFormat_->Type(); - type.append("/select"); - parameters["x-oss-process"] = type; - } - return parameters; +ParameterCollection SelectObjectRequest::specialParameters() const { + auto parameters = GetObjectRequest::specialParameters(); + if (inputFormat_) { + auto type = inputFormat_->Type(); + type.append("/select"); + parameters["x-oss-process"] = type; + } + return parameters; } diff --git a/sdk/src/resumable/ResumableDownloader.cc b/sdk/src/resumable/ResumableDownloader.cc index c9a1123..327903c 100644 --- a/sdk/src/resumable/ResumableDownloader.cc +++ b/sdk/src/resumable/ResumableDownloader.cc @@ -14,500 +14,515 @@ * limitations under the License. */ -#include -#include -#include -#include -#include "../utils/Utils.h" +#include "../external/json/json.h" #include "../utils/Crc64.h" -#include "../utils/LogUtils.h" #include "../utils/FileSystemUtils.h" -#include "../external/json/json.h" -//#include "OssClientImpl.h" -#include "ResumableDownloader.h" +#include "../utils/LogUtils.h" +#include "../utils/Utils.h" +#include +#include +#include +#include + +// #include "OssClientImpl.h" #include "../model/ModelError.h" +#include "ResumableDownloader.h" using namespace AlibabaCloud::OSS; struct DownloaderTransferState { - int64_t transfered; - void *userData; + int64_t transfered; + void *userData; }; -GetObjectOutcome ResumableDownloader::Download() -{ - OssError err; - - if (0 != validate(err)) { - return GetObjectOutcome(err); - } - - PartRecordList partsToDownload; - if (getPartsToDownload(err, partsToDownload) != 0) { - return GetObjectOutcome(err); - } +GetObjectOutcome ResumableDownloader::Download() { + OssError err; + + if (0 != validate(err)) { + return GetObjectOutcome(err); + } + + PartRecordList partsToDownload; + if (getPartsToDownload(err, partsToDownload) != 0) { + return GetObjectOutcome(err); + } + + // task queue + PartRecordList downloadedParts; + if (hasRecord_) { + downloadedParts = record_.parts; + } + std::vector outcomes; + std::vector threadPool; + + for (uint32_t i = 0; i < request_.ThreadNum(); i++) { + threadPool.emplace_back(std::thread([&]() { + PartRecord part; + while (true) { + { + std::lock_guard lck(lock_); + if (partsToDownload.empty()) + break; + part = partsToDownload.front(); + partsToDownload.erase(partsToDownload.begin()); + } - //task queue - PartRecordList downloadedParts; - if (hasRecord_) { - downloadedParts = record_.parts; - } - std::vector outcomes; - std::vector threadPool; - - for (uint32_t i = 0; i < request_.ThreadNum(); i++) { - threadPool.emplace_back(std::thread([&]() { - PartRecord part; - while (true) { - { - std::lock_guard lck(lock_); - if (partsToDownload.empty()) - break; - part = partsToDownload.front(); - partsToDownload.erase(partsToDownload.begin()); - } - - if (!client_->isEnableRequest()) - break; - - uint64_t pos = partSize_ * (part.partNumber - 1); - uint64_t start = part.offset; - uint64_t end = start + part.size - 1; - auto getObjectReq = GetObjectRequest(request_.Bucket(), request_.Key(), request_.ModifiedSinceConstraint(), request_.UnmodifiedSinceConstraint(), - request_.MatchingETagsConstraint(), request_.NonmatchingETagsConstraint(), request_.ResponseHeaderParameters()); - getObjectReq.setResponseStreamFactory([=]() { - auto tmpFstream = GetFstreamByPath(request_.TempFilePath(), request_.TempFilePathW(), - std::ios_base::in | std::ios_base::out | std::ios_base::binary); - tmpFstream->seekp(pos, tmpFstream->beg); - return tmpFstream; - }); - getObjectReq.setRange(start, end); - getObjectReq.setFlags(getObjectReq.Flags() | REQUEST_FLAG_CHECK_CRC64 | REQUEST_FLAG_SAVE_CLIENT_CRC64); - - DownloaderTransferState transferState; - auto process = request_.TransferProgress(); - if (process.Handler) { - transferState.transfered = 0; - transferState.userData = (void *)this; - TransferProgress uploadPartProcess = { DownloadPartProcessCallback, (void *)&transferState }; - getObjectReq.setTransferProgress(uploadPartProcess); - } - if (request_.RequestPayer() == RequestPayer::Requester) { - getObjectReq.setRequestPayer(request_.RequestPayer()); - } - if (request_.TrafficLimit() != 0) { - getObjectReq.setTrafficLimit(request_.TrafficLimit()); - } - if (!request_.VersionId().empty()) { - getObjectReq.setVersionId(request_.VersionId()); - } - auto outcome = GetObjectWrap(getObjectReq); + if (!client_->isEnableRequest()) + break; + + uint64_t pos = partSize_ * (part.partNumber - 1); + uint64_t start = part.offset; + uint64_t end = start + part.size - 1; + auto getObjectReq = + GetObjectRequest(request_.Bucket(), request_.Key(), + request_.ModifiedSinceConstraint(), + request_.UnmodifiedSinceConstraint(), + request_.MatchingETagsConstraint(), + request_.NonmatchingETagsConstraint(), + request_.ResponseHeaderParameters()); + getObjectReq.setResponseStreamFactory([this, pos]() { + auto tmpFstream = GetFstreamByPath( + request_.TempFilePath(), request_.TempFilePathW(), + std::ios_base::in | std::ios_base::out | std::ios_base::binary); + tmpFstream->seekp(pos, tmpFstream->beg); + return tmpFstream; + }); + getObjectReq.setRange(start, end); + getObjectReq.setFlags(getObjectReq.Flags() | REQUEST_FLAG_CHECK_CRC64 | + REQUEST_FLAG_SAVE_CLIENT_CRC64); + + DownloaderTransferState transferState; + auto process = request_.TransferProgress(); + if (process.Handler) { + transferState.transfered = 0; + transferState.userData = (void *)this; + TransferProgress uploadPartProcess = {DownloadPartProcessCallback, + (void *)&transferState}; + getObjectReq.setTransferProgress(uploadPartProcess); + } + if (request_.RequestPayer() == RequestPayer::Requester) { + getObjectReq.setRequestPayer(request_.RequestPayer()); + } + if (request_.TrafficLimit() != 0) { + getObjectReq.setTrafficLimit(request_.TrafficLimit()); + } + if (!request_.VersionId().empty()) { + getObjectReq.setVersionId(request_.VersionId()); + } + auto outcome = GetObjectWrap(getObjectReq); #ifdef ENABLE_OSS_TEST - if (!!(request_.Flags() & 0x40000000) && part.partNumber == 2) { - const char* TAG = "ResumableDownloadObjectClient"; - OSS_LOG(LogLevel::LogDebug, TAG, "NO.2 part data download failed."); - outcome = GetObjectOutcome(); - } + if (!!(request_.Flags() & 0x40000000) && part.partNumber == 2) { + const char *TAG = "ResumableDownloadObjectClient"; + OSS_LOG(LogLevel::LogDebug, TAG, "NO.2 part data download failed."); + outcome = GetObjectOutcome(); + } #endif // ENABLE_OSS_TEST - // lock - { - std::lock_guard lck(lock_); - if (outcome.isSuccess()) { - part.crc64 = std::strtoull(outcome.result().Metadata().HttpMetaData().at("x-oss-hash-crc64ecma-by-client").c_str(), nullptr, 10); - downloadedParts.push_back(part); - } - outcomes.push_back(outcome); - - //update record - if (hasRecordPath() && outcome.isSuccess()) { - auto &record = record_; - record.parts = downloadedParts; - - Json::Value root; - root["opType"] = record.opType; - root["bucket"] = record.bucket; - root["key"] = record.key; - root["filePath"] = record.filePath; - root["mtime"] = record.mtime; - root["size"] = record.size; - root["partSize"] = record.partSize; - - int index = 0; - for (PartRecord& partR : record.parts) { - root["parts"][index]["partNumber"] = partR.partNumber; - root["parts"][index]["size"] = partR.size; - root["parts"][index]["crc64"] = partR.crc64; - index++; - } - - std::stringstream ss; - ss << root; - std::string md5Sum = ComputeContentETag(ss); - root["md5Sum"] = md5Sum; - - if (request_.RangeIsSet()) { - root["rangeStart"] = record.rangeStart; - root["rangeEnd"] = record.rangeEnd; - } - - auto recordStream = GetFstreamByPath(recordPath_, recordPathW_, std::ios::out); - if (recordStream->is_open()) { - *recordStream << root; - recordStream->close(); - } - } - } + // lock + { + std::lock_guard lck(lock_); + if (outcome.isSuccess()) { + part.crc64 = std::strtoull(outcome.result() + .Metadata() + .HttpMetaData() + .at("x-oss-hash-crc64ecma-by-client") + .c_str(), + nullptr, 10); + downloadedParts.push_back(part); + } + outcomes.push_back(outcome); + + // update record + if (hasRecordPath() && outcome.isSuccess()) { + auto &record = record_; + record.parts = downloadedParts; + + Json::Value root; + root["opType"] = record.opType; + root["bucket"] = record.bucket; + root["key"] = record.key; + root["filePath"] = record.filePath; + root["mtime"] = record.mtime; + root["size"] = record.size; + root["partSize"] = record.partSize; + + int index = 0; + for (PartRecord &partR : record.parts) { + root["parts"][index]["partNumber"] = partR.partNumber; + root["parts"][index]["size"] = partR.size; + root["parts"][index]["crc64"] = partR.crc64; + index++; } - })); - } - for (auto& worker : threadPool) { - if (worker.joinable()) { - worker.join(); - } - } + std::stringstream ss; + ss << root; + std::string md5Sum = ComputeContentETag(ss); + root["md5Sum"] = md5Sum; + + if (request_.RangeIsSet()) { + root["rangeStart"] = record.rangeStart; + root["rangeEnd"] = record.rangeEnd; + } - std::shared_ptr content = nullptr; - for (auto& outcome : outcomes) { - if (!outcome.isSuccess()) { - return GetObjectOutcome(outcome.error()); + auto recordStream = + GetFstreamByPath(recordPath_, recordPathW_, std::ios::out); + if (recordStream->is_open()) { + *recordStream << root; + recordStream->close(); + } + } } - outcome.result().setContent(content); - } + } + })); + } - if (!client_->isEnableRequest()) { - return GetObjectOutcome(OssError("ClientError:100002", "Disable all requests by upper.")); + for (auto &worker : threadPool) { + if (worker.joinable()) { + worker.join(); } + } - // sort - std::sort(downloadedParts.begin(), downloadedParts.end(), [&](const PartRecord& a, const PartRecord& b) - { - return a.partNumber < b.partNumber; - }); - - ObjectMetaData meta; - if (outcomes.empty()) { - HeadObjectRequest hRequest(request_.Bucket(), request_.Key()); - if (request_.RequestPayer() == RequestPayer::Requester) { - hRequest.setRequestPayer(request_.RequestPayer()); - } - if (!request_.VersionId().empty()) { - hRequest.setVersionId(request_.VersionId()); - } - auto hOutcome = client_->HeadObject(hRequest); - if (!hOutcome.isSuccess()) { - return GetObjectOutcome(hOutcome.error()); - } - meta = hOutcome.result(); + std::shared_ptr content = nullptr; + for (auto &outcome : outcomes) { + if (!outcome.isSuccess()) { + return GetObjectOutcome(outcome.error()); } - else { - meta = outcomes[0].result().Metadata(); + outcome.result().setContent(content); + } + + if (!client_->isEnableRequest()) { + return GetObjectOutcome( + OssError("ClientError:100002", "Disable all requests by upper.")); + } + + // sort + std::sort(downloadedParts.begin(), downloadedParts.end(), + [&](const PartRecord &a, const PartRecord &b) { + return a.partNumber < b.partNumber; + }); + + ObjectMetaData meta; + if (outcomes.empty()) { + HeadObjectRequest hRequest(request_.Bucket(), request_.Key()); + if (request_.RequestPayer() == RequestPayer::Requester) { + hRequest.setRequestPayer(request_.RequestPayer()); } - meta.setContentLength(contentLength_); - - //check crc and update metadata - if (!request_.RangeIsSet()) { - if (client_->configuration().enableCrc64) { - uint64_t localCRC64 = downloadedParts[0].crc64; - for (size_t i = 1; i < downloadedParts.size(); i++) { - localCRC64 = CRC64::CombineCRC(localCRC64, downloadedParts[i].crc64, downloadedParts[i].size); - } - if (localCRC64 != meta.CRC64()) { - return GetObjectOutcome(OssError("CrcCheckError", "ResumableDownload object CRC checksum fail.")); - } - } - meta.HttpMetaData().erase(Http::CONTENT_RANGE); + if (!request_.VersionId().empty()) { + hRequest.setVersionId(request_.VersionId()); } - else { - std::stringstream ss; - ss << "bytes " << std::to_string(request_.RangeStart()) << "-"; - if (request_.RangeEnd() != -1) { - ss << std::to_string(request_.RangeEnd()) << "/" << std::to_string(objectSize_); - } - else { - ss << std::to_string(objectSize_ - 1) << "/" << std::to_string(objectSize_); - } - meta.HttpMetaData()["Content-Range"] = ss.str(); + auto hOutcome = client_->HeadObject(hRequest); + if (!hOutcome.isSuccess()) { + return GetObjectOutcome(hOutcome.error()); } - - if (meta.HttpMetaData().find("x-oss-hash-crc64ecma-by-client") != meta.HttpMetaData().end()) { - meta.HttpMetaData().erase("x-oss-hash-crc64ecma-by-client"); - } - - if (!renameTempFile()) { - std::stringstream ss; - ss << "rename temp file failed"; - return GetObjectOutcome(OssError("RenameError", ss.str())); + meta = hOutcome.result(); + } else { + meta = outcomes[0].result().Metadata(); + } + meta.setContentLength(contentLength_); + + // check crc and update metadata + if (!request_.RangeIsSet()) { + if (client_->configuration().enableCrc64) { + uint64_t localCRC64 = downloadedParts[0].crc64; + for (size_t i = 1; i < downloadedParts.size(); i++) { + localCRC64 = CRC64::CombineCRC(localCRC64, downloadedParts[i].crc64, + downloadedParts[i].size); + } + if (localCRC64 != meta.CRC64()) { + return GetObjectOutcome(OssError( + "CrcCheckError", "ResumableDownload object CRC checksum fail.")); + } } + meta.HttpMetaData().erase(Http::CONTENT_RANGE); + } else { + std::stringstream ss; + ss << "bytes " << std::to_string(request_.RangeStart()) << "-"; + if (request_.RangeEnd() != -1) { + ss << std::to_string(request_.RangeEnd()) << "/" + << std::to_string(objectSize_); + } else { + ss << std::to_string(objectSize_ - 1) << "/" + << std::to_string(objectSize_); + } + meta.HttpMetaData()["Content-Range"] = ss.str(); + } - removeRecordFile(); + if (meta.HttpMetaData().find("x-oss-hash-crc64ecma-by-client") != + meta.HttpMetaData().end()) { + meta.HttpMetaData().erase("x-oss-hash-crc64ecma-by-client"); + } - GetObjectResult result(request_.Bucket(), request_.Key(), meta); - return GetObjectOutcome(result); -} + if (!renameTempFile()) { + std::stringstream ss; + ss << "rename temp file failed"; + return GetObjectOutcome(OssError("RenameError", ss.str())); + } -int ResumableDownloader::prepare(OssError& err) -{ - UNUSED_PARAM(err); - - determinePartSize(); - if (hasRecordPath()) { - initRecord(); - - Json::Value root; - root["opType"] = record_.opType; - root["bucket"] = record_.bucket; - root["key"] = record_.key; - root["filePath"] = record_.filePath; - root["mtime"] = record_.mtime; - root["size"] = record_.size; - root["partSize"] = record_.partSize; - root["parts"].resize(0); - - std::stringstream ss; - ss << root; - std::string md5Sum = ComputeContentETag(ss); - root["md5Sum"] = md5Sum; - - if (request_.RangeIsSet()) { - root["rangeStart"] = record_.rangeStart; - root["rangeEnd"] = record_.rangeEnd; - } + removeRecordFile(); - auto recordStream = GetFstreamByPath(recordPath_, recordPathW_, std::ios::out); - if (recordStream->is_open()) { - *recordStream << root; - recordStream->close(); - } - } - return 0; + GetObjectResult result(request_.Bucket(), request_.Key(), meta); + return GetObjectOutcome(result); } -int ResumableDownloader::validateRecord() -{ - auto record = record_; +int ResumableDownloader::prepare(OssError &err) { + UNUSED_PARAM(err); - if (record.size != objectSize_ || record.mtime != request_.ObjectMtime()) { - return ARG_ERROR_DOWNLOAD_OBJECT_MODIFIED; - } - - if (request_.RangeIsSet()) { - if (record.rangeStart != request_.RangeStart() || record.rangeEnd != request_.RangeEnd()) { - return ARG_ERROR_RANGE_HAS_BEEN_RESET; - } - } + determinePartSize(); + if (hasRecordPath()) { + initRecord(); Json::Value root; - root["opType"] = record.opType; - root["bucket"] = record.bucket; - root["key"] = record.key; - root["filePath"] = record.filePath; - root["mtime"] = record.mtime; - root["size"] = record.size; - root["partSize"] = record.partSize; + root["opType"] = record_.opType; + root["bucket"] = record_.bucket; + root["key"] = record_.key; + root["filePath"] = record_.filePath; + root["mtime"] = record_.mtime; + root["size"] = record_.size; + root["partSize"] = record_.partSize; root["parts"].resize(0); - int index = 0; - for (PartRecord& part : record.parts) { - root["parts"][index]["partNumber"] = part.partNumber; - root["parts"][index]["size"] = part.size; - root["parts"][index]["crc64"] = part.crc64; - index++; - } - if (!(record.rangeStart == 0 && record.rangeEnd == -1)) { - root["rangeStart"] = record.rangeStart; - root["rangeEnd"] = record.rangeEnd; + std::stringstream ss; + ss << root; + std::string md5Sum = ComputeContentETag(ss); + root["md5Sum"] = md5Sum; + + if (request_.RangeIsSet()) { + root["rangeStart"] = record_.rangeStart; + root["rangeEnd"] = record_.rangeEnd; } - - std::stringstream recordStream; - recordStream << root; - std::string md5Sum = ComputeContentETag(recordStream); - if (md5Sum != record.md5Sum) { - return -1; + auto recordStream = + GetFstreamByPath(recordPath_, recordPathW_, std::ios::out); + if (recordStream->is_open()) { + *recordStream << root; + recordStream->close(); } - return 0; + } + return 0; } -int ResumableDownloader::loadRecord() -{ - auto recordStream = GetFstreamByPath(recordPath_, recordPathW_, std::ios::in); - if (recordStream->is_open()) { - Json::Value root; - Json::CharReaderBuilder rbuilder; - std::string errMsg; - if (!Json::parseFromStream(rbuilder, *recordStream, &root, &errMsg)) - { - return ARG_ERROR_PARSE_DOWNLOAD_RECORD_FILE; - } +int ResumableDownloader::validateRecord() { + auto record = record_; - record_.opType = root["opType"].asString(); - record_.bucket = root["bucket"].asString(); - record_.key = root["key"].asString(); - record_.filePath = root["filePath"].asString(); - record_.mtime = root["mtime"].asString(); - record_.size = root["size"].asUInt64(); - record_.partSize = root["partSize"].asUInt64(); - - PartRecord part; - for (uint32_t i = 0; i < root["parts"].size(); i++) { - Json::Value partValue = root["parts"][i]; - part.partNumber = partValue["partNumber"].asInt(); - part.size = partValue["size"].asInt64(); - part.crc64 = partValue["crc64"].asUInt64(); - record_.parts.push_back(part); - } - record_.md5Sum = root["md5Sum"].asString(); - - if (root["rangeStart"] != Json::nullValue && root["rangeEnd"] != Json::nullValue) { - record_.rangeStart = root["rangeStart"].asInt64(); - record_.rangeEnd = root["rangeEnd"].asInt64(); - } - else if(root["rangeStart"] == Json::nullValue && root["rangeEnd"] == Json::nullValue){ - record_.rangeStart = 0; - record_.rangeEnd = -1; - }else { - return ARG_ERROR_INVALID_RANGE_IN_DWONLOAD_RECORD; - } + if (record.size != objectSize_ || record.mtime != request_.ObjectMtime()) { + return ARG_ERROR_DOWNLOAD_OBJECT_MODIFIED; + } - partSize_ = record_.partSize; - hasRecord_ = true; - recordStream->close(); + if (request_.RangeIsSet()) { + if (record.rangeStart != request_.RangeStart() || + record.rangeEnd != request_.RangeEnd()) { + return ARG_ERROR_RANGE_HAS_BEEN_RESET; } - - return 0; + } + + Json::Value root; + root["opType"] = record.opType; + root["bucket"] = record.bucket; + root["key"] = record.key; + root["filePath"] = record.filePath; + root["mtime"] = record.mtime; + root["size"] = record.size; + root["partSize"] = record.partSize; + root["parts"].resize(0); + int index = 0; + for (PartRecord &part : record.parts) { + root["parts"][index]["partNumber"] = part.partNumber; + root["parts"][index]["size"] = part.size; + root["parts"][index]["crc64"] = part.crc64; + index++; + } + + if (!(record.rangeStart == 0 && record.rangeEnd == -1)) { + root["rangeStart"] = record.rangeStart; + root["rangeEnd"] = record.rangeEnd; + } + + std::stringstream recordStream; + recordStream << root; + + std::string md5Sum = ComputeContentETag(recordStream); + if (md5Sum != record.md5Sum) { + return -1; + } + return 0; } -void ResumableDownloader::genRecordPath() -{ - recordPath_ = ""; - recordPathW_ = L""; - - if (!request_.hasCheckpointDir()) - return; - - std::stringstream ss; - ss << "oss://" << request_.Bucket() << "/" << request_.Key(); - if (!request_.VersionId().empty()) { - ss << "?versionId=" << request_.VersionId(); +int ResumableDownloader::loadRecord() { + auto recordStream = GetFstreamByPath(recordPath_, recordPathW_, std::ios::in); + if (recordStream->is_open()) { + Json::Value root; + Json::CharReaderBuilder rbuilder; + std::string errMsg; + if (!Json::parseFromStream(rbuilder, *recordStream, &root, &errMsg)) { + return ARG_ERROR_PARSE_DOWNLOAD_RECORD_FILE; } - auto srcPath = ss.str(); - auto destPath = !request_.FilePathW().empty() ? toString(request_.FilePathW()) : request_.FilePath(); - auto safeFileName = ComputeContentETag(srcPath) + "--" + ComputeContentETag(destPath); - if (!request_.CheckpointDirW().empty()) { - recordPathW_ = request_.CheckpointDirW() + WPATH_DELIMITER + toWString(safeFileName);; + record_.opType = root["opType"].asString(); + record_.bucket = root["bucket"].asString(); + record_.key = root["key"].asString(); + record_.filePath = root["filePath"].asString(); + record_.mtime = root["mtime"].asString(); + record_.size = root["size"].asUInt64(); + record_.partSize = root["partSize"].asUInt64(); + + PartRecord part; + for (uint32_t i = 0; i < root["parts"].size(); i++) { + Json::Value partValue = root["parts"][i]; + part.partNumber = partValue["partNumber"].asInt(); + part.size = partValue["size"].asInt64(); + part.crc64 = partValue["crc64"].asUInt64(); + record_.parts.push_back(part); } - else { - recordPath_ = request_.CheckpointDir() + PATH_DELIMITER + safeFileName; + record_.md5Sum = root["md5Sum"].asString(); + + if (root["rangeStart"] != Json::nullValue && + root["rangeEnd"] != Json::nullValue) { + record_.rangeStart = root["rangeStart"].asInt64(); + record_.rangeEnd = root["rangeEnd"].asInt64(); + } else if (root["rangeStart"] == Json::nullValue && + root["rangeEnd"] == Json::nullValue) { + record_.rangeStart = 0; + record_.rangeEnd = -1; + } else { + return ARG_ERROR_INVALID_RANGE_IN_DWONLOAD_RECORD; } -} -int ResumableDownloader::getPartsToDownload(OssError &err, PartRecordList &partsToDownload) -{ - UNUSED_PARAM(err); + partSize_ = record_.partSize; + hasRecord_ = true; + recordStream->close(); + } - std::set partNumbersDownloaded; - if (hasRecord_) { - for (PartRecord &part : record_.parts) { - partNumbersDownloaded.insert(part.partNumber); - consumedSize_ += part.size; - } - } + return 0; +} - int64_t start = 0; - int64_t end = objectSize_ - 1; +void ResumableDownloader::genRecordPath() { + recordPath_ = ""; + recordPathW_ = L""; + + if (!request_.hasCheckpointDir()) + return; + + std::stringstream ss; + ss << "oss://" << request_.Bucket() << "/" << request_.Key(); + if (!request_.VersionId().empty()) { + ss << "?versionId=" << request_.VersionId(); + } + auto srcPath = ss.str(); + auto destPath = !request_.FilePathW().empty() ? toString(request_.FilePathW()) + : request_.FilePath(); + auto safeFileName = + ComputeContentETag(srcPath) + "--" + ComputeContentETag(destPath); + + if (!request_.CheckpointDirW().empty()) { + recordPathW_ = + request_.CheckpointDirW() + WPATH_DELIMITER + toWString(safeFileName); + ; + } else { + recordPath_ = request_.CheckpointDir() + PATH_DELIMITER + safeFileName; + } +} - if (request_.RangeIsSet()) { - start = request_.RangeStart(); - end = request_.RangeEnd(); - if (end == -1) { - end = objectSize_ - 1; - } - contentLength_ = end - start + 1; +int ResumableDownloader::getPartsToDownload(OssError &err, + PartRecordList &partsToDownload) { + UNUSED_PARAM(err); + + std::set partNumbersDownloaded; + if (hasRecord_) { + for (PartRecord &part : record_.parts) { + partNumbersDownloaded.insert(part.partNumber); + consumedSize_ += part.size; } + } - int32_t index = 1; - for (int64_t offset = start; offset < end + 1; offset += partSize_, index++) { - PartRecord part; - part.partNumber = index; - part.offset = offset; - if (offset + (int64_t)partSize_ > end) { - part.size = end - offset + 1; - } - else { - part.size = partSize_; - } + int64_t start = 0; + int64_t end = objectSize_ - 1; - auto iterNum = partNumbersDownloaded.find(part.partNumber); - if (iterNum == partNumbersDownloaded.end()) { - partsToDownload.push_back(part); - } + if (request_.RangeIsSet()) { + start = request_.RangeStart(); + end = request_.RangeEnd(); + if (end == -1) { + end = objectSize_ - 1; } - return 0; -} - -void ResumableDownloader::initRecord() -{ - auto filePath = request_.FilePath(); - if (!request_.FilePathW().empty()) { - filePath = toString(request_.FilePathW()); + contentLength_ = end - start + 1; + } + + int32_t index = 1; + for (int64_t offset = start; offset < end + 1; offset += partSize_, index++) { + PartRecord part; + part.partNumber = index; + part.offset = offset; + if (offset + (int64_t)partSize_ > end) { + part.size = end - offset + 1; + } else { + part.size = partSize_; } - record_.opType = "ResumableDownload"; - record_.bucket = request_.Bucket(); - record_.key = request_.Key(); - record_.filePath = filePath; - record_.mtime = request_.ObjectMtime(); - record_.size = objectSize_; - record_.partSize = partSize_; - - //in this place we shuold consider the condition that range is not set - if (request_.RangeIsSet()) { - record_.rangeStart = request_.RangeStart(); - record_.rangeEnd = request_.RangeEnd(); - } - else { - record_.rangeStart = 0; - record_.rangeEnd = -1; + auto iterNum = partNumbersDownloaded.find(part.partNumber); + if (iterNum == partNumbersDownloaded.end()) { + partsToDownload.push_back(part); } + } + return 0; } -void ResumableDownloader::DownloadPartProcessCallback(size_t increment, int64_t transfered, int64_t total, void *userData) -{ - UNUSED_PARAM(total); - auto transferState = (DownloaderTransferState *)userData; - auto downloader = (ResumableDownloader*)transferState->userData; - auto inc = transfered - transferState->transfered; - transferState->transfered = std::max(transfered, transferState->transfered); - inc = std::max(inc, static_cast(0)); - increment = static_cast(inc); - - std::lock_guard lck(downloader->lock_); - downloader->consumedSize_ += increment; - - auto process = downloader->request_.TransferProgress(); - if (process.Handler) { - process.Handler(increment, downloader->consumedSize_, downloader->contentLength_, process.UserData); - } +void ResumableDownloader::initRecord() { + auto filePath = request_.FilePath(); + if (!request_.FilePathW().empty()) { + filePath = toString(request_.FilePathW()); + } + + record_.opType = "ResumableDownload"; + record_.bucket = request_.Bucket(); + record_.key = request_.Key(); + record_.filePath = filePath; + record_.mtime = request_.ObjectMtime(); + record_.size = objectSize_; + record_.partSize = partSize_; + + // in this place we shuold consider the condition that range is not set + if (request_.RangeIsSet()) { + record_.rangeStart = request_.RangeStart(); + record_.rangeEnd = request_.RangeEnd(); + } else { + record_.rangeStart = 0; + record_.rangeEnd = -1; + } +} + +void ResumableDownloader::DownloadPartProcessCallback(size_t increment, + int64_t transfered, + int64_t total, + void *userData) { + UNUSED_PARAM(total); + auto transferState = (DownloaderTransferState *)userData; + auto downloader = (ResumableDownloader *)transferState->userData; + auto inc = transfered - transferState->transfered; + transferState->transfered = std::max(transfered, transferState->transfered); + inc = std::max(inc, static_cast(0)); + increment = static_cast(inc); + + std::lock_guard lck(downloader->lock_); + downloader->consumedSize_ += increment; + + auto process = downloader->request_.TransferProgress(); + if (process.Handler) { + process.Handler(increment, downloader->consumedSize_, + downloader->contentLength_, process.UserData); + } } -bool ResumableDownloader::renameTempFile() -{ +bool ResumableDownloader::renameTempFile() { #ifdef _WIN32 - if (!request_.TempFilePathW().empty()) { - return RenameFile(request_.TempFilePathW(), request_.FilePathW()); - } - else + if (!request_.TempFilePathW().empty()) { + return RenameFile(request_.TempFilePathW(), request_.FilePathW()); + } else #endif - { - return RenameFile(request_.TempFilePath(), request_.FilePath()); - } -} - -GetObjectOutcome ResumableDownloader::GetObjectWrap(const GetObjectRequest &request) const -{ - return client_->GetObject(request); + { + return RenameFile(request_.TempFilePath(), request_.FilePath()); + } } +GetObjectOutcome +ResumableDownloader::GetObjectWrap(const GetObjectRequest &request) const { + return client_->GetObject(request); +}