diff --git a/include/cos_api.h b/include/cos_api.h index 8d95b41..c09c33e 100644 --- a/include/cos_api.h +++ b/include/cos_api.h @@ -796,7 +796,7 @@ class CosAPI { /// \param req AsyncResumableGetObject /// \return 返回context SharedAsyncContext AsyncResumableGetObject(const AsyncGetObjectReq& req); - SharedAsyncContext AsyncResumableGetObject(const AsyncGetObjectReq& req, Poco::TaskManager*& taskManager);; + SharedAsyncContext AsyncResumableGetObject(const AsyncGetObjectReq& req, Poco::TaskManager*& taskManager); /// \brief 异步多线程下载对象到本地 /// \param req MultiGetObjectAsync请求 diff --git a/include/cos_defines.h b/include/cos_defines.h index 0aae96f..d29fdb8 100644 --- a/include/cos_defines.h +++ b/include/cos_defines.h @@ -39,6 +39,7 @@ const uint64_t kPartSize1M = 1 * 1024 * 1024; /// 分块大小5G const uint64_t kPartSize5G = (uint64_t)5 * 1024 * 1024 * 1024; +const bool COS_CHANGE_BACKUP_DOMAIN = true; typedef enum log_out_type { COS_LOG_NULL = 0, COS_LOG_STDOUT, diff --git a/include/cos_sys_config.h b/include/cos_sys_config.h index 1cc3b5f..adcd2e3 100644 --- a/include/cos_sys_config.h +++ b/include/cos_sys_config.h @@ -112,7 +112,8 @@ class CosSysConfig { /// \brief 根据传入appid、region、bucket_name返回对应的hostname static std::string GetHost(uint64_t app_id, const std::string& region, - const std::string& bucket_name); + const std::string& bucket_name, + bool change_backup_domain = false); /// \brief 获取CI域名 static std::string GetCIHost(const std::string& bucket_name, @@ -158,6 +159,10 @@ class CosSysConfig { /// \brief 获取dns cache大小 static unsigned GetDnsCacheSize(); + static void SetRetryChangeDomain(bool retry_change_domain); + + static bool GetRetryChangeDomain(); + private: // 打印日志:0,不打印,1:打印到屏幕,2:打印到syslog static LOG_OUT_TYPE m_log_outtype; @@ -208,6 +213,8 @@ class CosSysConfig { static unsigned m_dns_cache_expire_seconds; // dns cache大小 static unsigned m_dns_cache_size; + + static bool m_retry_change_domain; }; } // namespace qcloud_cos diff --git a/include/op/base_op.h b/include/op/base_op.h index 5ef1c05..5109fc6 100644 --- a/include/op/base_op.h +++ b/include/op/base_op.h @@ -49,6 +49,12 @@ class BaseOp { bool IsDomainSameToHost() const; + bool UseDefaultDomain() const; + + bool IsDefaultHost(const std::string &host) const; + + std::string ChangeHostSuffix(const std::string &host); + /// \brief 封装了cos Service/Bucket/Object 相关接口的通用操作, /// 包括签名计算、请求发送、返回内容解析等 /// diff --git a/include/op/bucket_op.h b/include/op/bucket_op.h index 96ed034..c09b07e 100644 --- a/include/op/bucket_op.h +++ b/include/op/bucket_op.h @@ -43,7 +43,8 @@ class BucketOp : public BaseOp { /// \param resp PutBucket返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult PutBucket(const PutBucketReq& req, PutBucketResp* resp); + CosResult PutBucket(const PutBucketReq& req, PutBucketResp* resp, + bool change_backup_domain = false); /// \brief 确认Bucket是否存在 /// (详见:https://cloud.tencent.com/document/product/436/7735) @@ -52,7 +53,8 @@ class BucketOp : public BaseOp { /// \param resp HeadBucket返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult HeadBucket(const HeadBucketReq& req, HeadBucketResp* resp); + CosResult HeadBucket(const HeadBucketReq& req, HeadBucketResp* resp, + bool change_backup_domain = false); /// \brief 列出Bucket下的部分或者全部Object /// (详见:https://www.qcloud.com/document/product/436/7734) @@ -61,17 +63,20 @@ class BucketOp : public BaseOp { /// \param resp GetBucket返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult GetBucket(const GetBucketReq& req, GetBucketResp* resp); + CosResult GetBucket(const GetBucketReq& req, GetBucketResp* resp, + bool change_backup_domain = false); CosResult ListMultipartUpload(const ListMultipartUploadReq& req, - ListMultipartUploadResp* resp); + ListMultipartUploadResp* resp, + bool change_backup_domain = false); /// \brief 删除Bucket /// /// \param req DeleteBucket请求 /// \param resp DeleteBucket返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult DeleteBucket(const DeleteBucketReq& req, DeleteBucketResp* resp); + CosResult DeleteBucket(const DeleteBucketReq& req, DeleteBucketResp* resp, + bool change_backup_domain = false); /// \brief 获得存储桶的版本控制信息 /// (详见:https://cloud.tencent.com/document/product/436/8597) @@ -81,7 +86,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketVersioning(const GetBucketVersioningReq& req, - GetBucketVersioningResp* resp); + GetBucketVersioningResp* resp, + bool change_backup_domain = false); /// \brief 启用或者暂停存储桶的版本控制功能 /// (详见:https://cloud.tencent.com/document/product/436/8591) @@ -91,7 +97,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketVersioning(const PutBucketVersioningReq& req, - PutBucketVersioningResp* resp); + PutBucketVersioningResp* resp, + bool change_backup_domain = false); /// \brief 列出Bucket下的跨域复制配置 /// @@ -100,7 +107,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketReplication(const GetBucketReplicationReq& req, - GetBucketReplicationResp* resp); + GetBucketReplicationResp* resp, + bool change_backup_domain = false); /// \brief 增加/替换Bucket下的跨域复制配置 /// @@ -109,7 +117,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketReplication(const PutBucketReplicationReq& req, - PutBucketReplicationResp* resp); + PutBucketReplicationResp* resp, + bool change_backup_domain = false); /// \brief 删除Bucket下的跨域复制配置 /// @@ -118,7 +127,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult DeleteBucketReplication(const DeleteBucketReplicationReq& req, - DeleteBucketReplicationResp* resp); + DeleteBucketReplicationResp* resp, + bool change_backup_domain = false); /// \brief 列出Bucket下的生命周期配置 /// @@ -127,7 +137,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketLifecycle(const GetBucketLifecycleReq& req, - GetBucketLifecycleResp* resp); + GetBucketLifecycleResp* resp, + bool change_backup_domain = false); /// \brief 增加/替换Bucket下的生命周期配置 /// @@ -136,7 +147,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketLifecycle(const PutBucketLifecycleReq& req, - PutBucketLifecycleResp* resp); + PutBucketLifecycleResp* resp, + bool change_backup_domain = false); /// \brief 删除Bucket下的生命周期配置 /// @@ -145,7 +157,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult DeleteBucketLifecycle(const DeleteBucketLifecycleReq& req, - DeleteBucketLifecycleResp* resp); + DeleteBucketLifecycleResp* resp, + bool change_backup_domain = false); /// \brief 列出Bucket下的ACL /// @@ -153,7 +166,8 @@ class BucketOp : public BaseOp { /// \param resp GetBucketACL返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult GetBucketACL(const GetBucketACLReq& req, GetBucketACLResp* resp); + CosResult GetBucketACL(const GetBucketACLReq& req, GetBucketACLResp* resp, + bool change_backup_domain = false); /// \brief 增加/替换Bucket下的ACL, 可以通过Header或者Body传入ACL信息 /// 注意Header 和 Body 只能选择其中一种,否则响应返回会冲突 @@ -162,7 +176,8 @@ class BucketOp : public BaseOp { /// \param resp PutBucketACL返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult PutBucketACL(const PutBucketACLReq& req, PutBucketACLResp* resp); + CosResult PutBucketACL(const PutBucketACLReq& req, PutBucketACLResp* resp, + bool change_backup_domain = false); /// \brief 获取Bucket的权限策略 /// @@ -170,7 +185,8 @@ class BucketOp : public BaseOp { /// \param resp GetBucketPolicy返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult GetBucketPolicy(const GetBucketPolicyReq& req, GetBucketPolicyResp* resp); + CosResult GetBucketPolicy(const GetBucketPolicyReq& req, GetBucketPolicyResp* resp, + bool change_backup_domain = false); /// \brief 写入/替换Bucket的权限策略,通过Body传入 /// @@ -178,7 +194,8 @@ class BucketOp : public BaseOp { /// \param resp PutBucketPolicy返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult PutBucketPolicy(const PutBucketPolicyReq& req, PutBucketPolicyResp* resp); + CosResult PutBucketPolicy(const PutBucketPolicyReq& req, PutBucketPolicyResp* resp, + bool change_backup_domain = false); /// \brief 删除Bucket的权限策略 /// @@ -186,7 +203,8 @@ class BucketOp : public BaseOp { /// \param resp DeleteBucketPolicy返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult DeleteBucketPolicy(const DeleteBucketPolicyReq& req, DeleteBucketPolicyResp* resp); + CosResult DeleteBucketPolicy(const DeleteBucketPolicyReq& req, DeleteBucketPolicyResp* resp, + bool change_backup_domain = false); /// \brief 列出Bucket下的CORS /// @@ -194,7 +212,8 @@ class BucketOp : public BaseOp { /// \param resp GetBucketCORS返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult GetBucketCORS(const GetBucketCORSReq& req, GetBucketCORSResp* resp); + CosResult GetBucketCORS(const GetBucketCORSReq& req, GetBucketCORSResp* resp, + bool change_backup_domain = false); /// \brief 增加/替换Bucket下的CORS /// @@ -202,7 +221,8 @@ class BucketOp : public BaseOp { /// \param resp PutBucketCORS返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult PutBucketCORS(const PutBucketCORSReq& req, PutBucketCORSResp* resp); + CosResult PutBucketCORS(const PutBucketCORSReq& req, PutBucketCORSResp* resp, + bool change_backup_domain = false); /// \brief 删除Bucket下的CORS /// @@ -211,7 +231,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult DeleteBucketCORS(const DeleteBucketCORSReq& req, - DeleteBucketCORSResp* resp); + DeleteBucketCORSResp* resp, + bool change_backup_domain = false); /// \brief 列出Bucket下的部分或者全部Object(包括多版本) /// @@ -220,7 +241,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketObjectVersions(const GetBucketObjectVersionsReq& req, - GetBucketObjectVersionsResp* resp); + GetBucketObjectVersionsResp* resp, + bool change_backup_domain = false); /// \brief 获取Bucket所在Location /// @@ -229,7 +251,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketLocation(const GetBucketLocationReq& req, - GetBucketLocationResp* resp); + GetBucketLocationResp* resp, + bool change_backup_domain = false); // TODO(sevenyou) // std::string ListMultipartUploads(); @@ -240,7 +263,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketLogging(const PutBucketLoggingReq& req, - PutBucketLoggingResp* resp); + PutBucketLoggingResp* resp, + bool change_backup_domain = false); /// \brief 用于获取源存储桶的日志配置信息 /// \brief https://cloud.tencent.com/document/product/436/17053 @@ -249,7 +273,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketLogging(const GetBucketLoggingReq& req, - GetBucketLoggingResp* resp); + GetBucketLoggingResp* resp, + bool change_backup_domain = false); /// \brief 用于存储桶绑定自定义域名 /// \brief @@ -258,7 +283,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketDomain(const PutBucketDomainReq& req, - PutBucketDomainResp* resp); + PutBucketDomainResp* resp, + bool change_backup_domain = false); /// \brief 用于获取存储桶绑定自定义域名 /// \brief @@ -267,7 +293,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketDomain(const GetBucketDomainReq& req, - GetBucketDomainResp* resp); + GetBucketDomainResp* resp, + bool change_backup_domain = false); /// \brief 存储桶配置静态网站,通过传入 XML /// 格式的配置文件进行配置,文件大小限制为64KB \brief @@ -276,7 +303,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketWebsite(const PutBucketWebsiteReq& req, - PutBucketWebsiteResp* resp); + PutBucketWebsiteResp* resp, + bool change_backup_domain = false); /// \brief 获取与存储桶关联的静态网站配置信息. /// \brief https://cloud.tencent.com/document/product/436/31929 @@ -285,7 +313,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketWebsite(const GetBucketWebsiteReq& req, - GetBucketWebsiteResp* resp); + GetBucketWebsiteResp* resp, + bool change_backup_domain = false); /// \brief 删除存储桶中的静态网站配置. /// \brief https://cloud.tencent.com/document/product/436/31928 @@ -294,7 +323,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult DeleteBucketWebsite(const DeleteBucketWebsiteReq& req, - DeleteBucketWebsiteResp* resp); + DeleteBucketWebsiteResp* resp, + bool change_backup_domain = false); /// \brief 为已存在的Bucket设置标签. /// \brief https://cloud.tencent.com/document/product/436/34838 @@ -303,7 +333,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketTagging(const PutBucketTaggingReq& req, - PutBucketTaggingResp* resp); + PutBucketTaggingResp* resp, + bool change_backup_domain = false); /// \brief 查询指定存储桶下已有的存储桶标签. /// \brief https://cloud.tencent.com/document/product/436/34837 @@ -312,7 +343,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketTagging(const GetBucketTaggingReq& req, - GetBucketTaggingResp* resp); + GetBucketTaggingResp* resp, + bool change_backup_domain = false); /// \brief 删除指定存储桶下已有的存储桶标签. /// \brief https://cloud.tencent.com/document/product/436/34836 @@ -321,7 +353,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult DeleteBucketTagging(const DeleteBucketTaggingReq& req, - DeleteBucketTaggingResp* resp); + DeleteBucketTaggingResp* resp, + bool change_backup_domain = false); /// \brief 用于在存储桶中创建清单任务. /// \brief https://cloud.tencent.com/document/product/436/33707 @@ -330,7 +363,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketInventory(const PutBucketInventoryReq& req, - PutBucketInventoryResp* resp); + PutBucketInventoryResp* resp, + bool change_backup_domain = false); /// \brief 查询存储桶中用户的清单任务信息. /// \brief https://cloud.tencent.com/document/product/436/33705 @@ -339,7 +373,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketInventory(const GetBucketInventoryReq& req, - GetBucketInventoryResp* resp); + GetBucketInventoryResp* resp, + bool change_backup_domain = false); /// \brief 请求返回一个存储桶中的所有清单任务. /// \brief https://cloud.tencent.com/document/product/436/33706 @@ -349,7 +384,8 @@ class BucketOp : public BaseOp { /// \return 本次请求的调用情况(如状态码等) CosResult ListBucketInventoryConfigurations( const ListBucketInventoryConfigurationsReq& req, - ListBucketInventoryConfigurationsResp* resp); + ListBucketInventoryConfigurationsResp* resp, + bool change_backup_domain = false); /// \brief 用于删除存储桶中指定的清单任务. /// \brief https://cloud.tencent.com/document/product/436/33704 @@ -358,7 +394,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult DeleteBucketInventory(const DeleteBucketInventoryReq& req, - DeleteBucketInventoryResp* resp); + DeleteBucketInventoryResp* resp, + bool change_backup_domain = false); /// \brief 用于为存储桶设置 Referer 白名单或者黑名单. /// \brief https://cloud.tencent.com/document/product/436/32492 /// \param req PutBucketReferer请求 @@ -366,7 +403,8 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketReferer(const PutBucketRefererReq& req, - PutBucketRefererResp* resp); + PutBucketRefererResp* resp, + bool change_backup_domain = false); /// \brief 读取存储桶 Referer 白名单或者黑名单. /// \brief https://cloud.tencent.com/document/product/436/32493 /// \param req GetBucketReferer请求 @@ -374,14 +412,16 @@ class BucketOp : public BaseOp { /// /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketReferer(const GetBucketRefererReq& req, - GetBucketRefererResp* resp); + GetBucketRefererResp* resp, + bool change_backup_domain = false); /// \brief 列举直播通道 /// \param req ListLiveChannelReq请求 /// \param resp ListLiveChannelResp返回 /// /// \return 本次请求的调用情况(如状态码等) CosResult ListLiveChannel(const ListLiveChannelReq& req, - ListLiveChannelResp* resp); + ListLiveChannelResp* resp, + bool change_backup_domain = false); /// \brief 配置存储桶智能分层 /// @@ -391,7 +431,8 @@ class BucketOp : public BaseOp { /// \return 本次请求的调用情况(如状态码等) CosResult PutBucketIntelligentTiering( const PutBucketIntelligentTieringReq& req, - PutBucketIntelligentTieringResp* resp); + PutBucketIntelligentTieringResp* resp, + bool change_backup_domain = false); /// \brief 获取存储桶智能分层配置 /// @@ -401,7 +442,8 @@ class BucketOp : public BaseOp { /// \return 本次请求的调用情况(如状态码等) CosResult GetBucketIntelligentTiering( const GetBucketIntelligentTieringReq& req, - GetBucketIntelligentTieringResp* resp); + GetBucketIntelligentTieringResp* resp, + bool change_backup_domain = false); /// \brief 存储桶绑定ci /// diff --git a/include/op/object_op.h b/include/op/object_op.h index a4ffd89..1bbbf10 100644 --- a/include/op/object_op.h +++ b/include/op/object_op.h @@ -1,4 +1,4 @@ -// Copyright (c) 2017, Tencent Inc. +// Copyright (c) 2017, Tencent Inc. // All rights reserved. // // Author: sevenyou @@ -41,7 +41,8 @@ class ObjectOp : public BaseOp { std::string GetResumableUploadID(const PutObjectByFileReq& originReq, const std::string& bucket_name, - const std::string& object_name); + const std::string& object_name, + bool change_backup_domain = false); bool CheckUploadPart(const PutObjectByFileReq& req, const std::string& bucket_name, @@ -59,7 +60,7 @@ class ObjectOp : public BaseOp { /// \param response HeadObject返回 /// /// \return 返回HTTP请求的状态码及错误信息 - CosResult HeadObject(const HeadObjectReq& req, HeadObjectResp* resp); + CosResult HeadObject(const HeadObjectReq& req, HeadObjectResp* resp, bool change_backup_domain = false); /// \brief 下载Bucket中的一个文件至流中 /// @@ -68,7 +69,7 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult GetObject(const GetObjectByStreamReq& req, - GetObjectByStreamResp* resp); + GetObjectByStreamResp* resp, bool change_backup_domain = false); /// \brief 下载Bucket中的一个文件到本地 /// @@ -77,7 +78,7 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult GetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp, - const SharedTransferHandler& handler = nullptr); + const SharedTransferHandler& handler = nullptr, bool change_backup_domain = false); /// \brief 多线程下载Bucket中的一个文件到本地 /// @@ -95,7 +96,7 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult PutObject(const PutObjectByFileReq& req, PutObjectByFileResp* resp, - const SharedTransferHandler& handler = nullptr); + const SharedTransferHandler& handler = nullptr, bool change_backup_domain = false); /// \brief 将指定流上传至指定Bucket中 /// @@ -104,7 +105,7 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult PutObject(const PutObjectByStreamReq& req, - PutObjectByStreamResp* resp, const SharedTransferHandler& handler=nullptr); + PutObjectByStreamResp* resp, const SharedTransferHandler& handler=nullptr, bool change_backup_domain = false); /// \brief 删除Object /// @@ -112,7 +113,7 @@ class ObjectOp : public BaseOp { /// \param resp DeleteObject返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult DeleteObject(const DeleteObjectReq& req, DeleteObjectResp* resp); + CosResult DeleteObject(const DeleteObjectReq& req, DeleteObjectResp* resp, bool change_backup_domain = false); /// \brief 批量删除Object /// @@ -120,7 +121,7 @@ class ObjectOp : public BaseOp { /// \param resp DeleteObjects返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult DeleteObjects(const DeleteObjectsReq& req, DeleteObjectsResp* resp); + CosResult DeleteObjects(const DeleteObjectsReq& req, DeleteObjectsResp* resp, bool change_backup_domain = false); /// \brief /// 请求实现初始化分片上传,成功执行此请求以后会返回UploadId用于后续的Upload @@ -131,7 +132,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult InitMultiUpload(const InitMultiUploadReq& req, - InitMultiUploadResp* resp); + InitMultiUploadResp* resp, + bool change_backup_domain = false); /// \brief 初始化以后的分块上传,支持的块的数量为1到10000,块的大小为1MB到5GB /// @@ -140,7 +142,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult UploadPartData(const UploadPartDataReq& req, - UploadPartDataResp* resp); + UploadPartDataResp* resp, + bool change_backup_domain = false); /// \brief /// 初始化以后的分块复制,实现将一个文件的分块内容从源路径复制到目标路径。 @@ -152,7 +155,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult UploadPartCopyData(const UploadPartCopyDataReq& req, - UploadPartCopyDataResp* resp); + UploadPartCopyDataResp* resp, + bool change_backup_domain = false); /// \brief 完成整个分块上传。当使用 Upload Parts 上传完所有块以后, /// 必须调用该 API 来完成整个文件的分块上传 @@ -162,7 +166,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult CompleteMultiUpload(const CompleteMultiUploadReq& req, - CompleteMultiUploadResp* resp); + CompleteMultiUploadResp* resp, + bool change_backup_domain = false); /// \brief 异步多线程上传 /// \param request MultiUploadObject请求 @@ -172,7 +177,8 @@ class ObjectOp : public BaseOp { /// \return result CosResult MultiUploadObject(const PutObjectByFileReq& req, MultiPutObjectResp* resp, - const SharedTransferHandler& handler = nullptr); + const SharedTransferHandler& handler = nullptr, + bool change_backup_domain = false); /// \brief 舍弃一个分块上传并删除已上传的块 /// @@ -181,7 +187,8 @@ class ObjectOp : public BaseOp { /// /// \return CosResult AbortMultiUpload(const AbortMultiUploadReq& req, - AbortMultiUploadResp* resp); + AbortMultiUploadResp* resp, + bool change_backup_domain = false); /// \brief 查询特定分块上传中的已上传的块 /// @@ -189,7 +196,7 @@ class ObjectOp : public BaseOp { /// \param resp ListParts返回 /// /// \return result - CosResult ListParts(const ListPartsReq& req, ListPartsResp* resp); + CosResult ListParts(const ListPartsReq& req, ListPartsResp* resp, bool change_backup_domain = false); /// \brief 列出Object下的ACL /// @@ -197,7 +204,7 @@ class ObjectOp : public BaseOp { /// \param resp GetObjectACL返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult GetObjectACL(const GetObjectACLReq& req, GetObjectACLResp* resp); + CosResult GetObjectACL(const GetObjectACLReq& req, GetObjectACLResp* resp, bool change_backup_domain = false); /// \brief 增加/替换Object下的ACL, 可以通过Header或者Body传入ACL信息 /// 注意Header 和 Body 只能选择其中一种,否则响应返回会冲突 @@ -206,7 +213,7 @@ class ObjectOp : public BaseOp { /// \param resp PutObjectACL返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult PutObjectACL(const PutObjectACLReq& req, PutObjectACLResp* resp); + CosResult PutObjectACL(const PutObjectACLReq& req, PutObjectACLResp* resp, bool change_backup_domain = false); /// \brief 已存在的Object设置标签. /// @@ -241,7 +248,7 @@ class ObjectOp : public BaseOp { /// \param resp PutObjectCopy返回 /// /// \return 本次请求的调用情况(如状态码等) - CosResult PutObjectCopy(const PutObjectCopyReq& req, PutObjectCopyResp* resp); + CosResult PutObjectCopy(const PutObjectCopyReq& req, PutObjectCopyResp* resp, bool change_backup_domain = false); /// \brief 复制文件,实现将一个文件的分块内容从源路径复制到目标路径。 /// 通过指定 x-cos-copy-source 来指定源文件,x-cos-copy-source-range @@ -251,7 +258,7 @@ class ObjectOp : public BaseOp { /// \param response Copy返回 /// /// \return 返回HTTP请求的状态码及错误信息 - CosResult Copy(const CopyReq& req, CopyResp* resp); + CosResult Copy(const CopyReq& req, CopyResp* resp, bool change_backup_domain = false); /// \brief 对一个通过 COS 归档为 archive 类型的对象进行恢复 /// @@ -260,14 +267,16 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult PostObjectRestore(const PostObjectRestoreReq& req, - PostObjectRestoreResp* resp); + PostObjectRestoreResp* resp, + bool change_backup_domain = false); std::string GeneratePresignedUrl(const GeneratePresignedUrlReq& req); - CosResult OptionsObject(const OptionsObjectReq& req, OptionsObjectResp* resp); + CosResult OptionsObject(const OptionsObjectReq& req, OptionsObjectResp* resp, bool change_backup_domain = false); CosResult SelectObjectContent(const SelectObjectContentReq& req, - SelectObjectContentResp* resp); + SelectObjectContentResp* resp, + bool change_backup_domain = false); CosResult AppendObject(const AppendObjectReq& req, AppendObjectResp* resp); @@ -278,7 +287,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult PutLiveChannel(const PutLiveChannelReq& req, - PutLiveChannelResp* resp); + PutLiveChannelResp* resp, + bool change_backup_domain = false); /// \brief 启用或禁用通道 /// @@ -287,7 +297,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult PutLiveChannelSwitch(const PutLiveChannelSwitchReq& req, - PutLiveChannelSwitchResp* resp); + PutLiveChannelSwitchResp* resp, + bool change_backup_domain = false); /// \brief 获取直播通道配置 /// @@ -296,7 +307,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult GetLiveChannel(const GetLiveChannelReq& req, - GetLiveChannelResp* resp); + GetLiveChannelResp* resp, + bool change_backup_domain = false); /// \brief 获取直播通道推流历史 /// @@ -305,7 +317,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult GetLiveChannelHistory(const GetLiveChannelHistoryReq& req, - GetLiveChannelHistoryResp* resp); + GetLiveChannelHistoryResp* resp, + bool change_backup_domain = false); /// \brief 获取直播通道推流状态 /// @@ -314,7 +327,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult GetLiveChannelStatus(const GetLiveChannelStatusReq& req, - GetLiveChannelStatusResp* resp); + GetLiveChannelStatusResp* resp, + bool change_backup_domain = false); /// \brief 删除直播通 /// @@ -323,7 +337,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult DeleteLiveChannel(const DeleteLiveChannelReq& req, - DeleteLiveChannelResp* resp); + DeleteLiveChannelResp* resp, + bool change_backup_domain = false); /// \brief 查询指定通道在指定时间段推流生成的播放列表 /// @@ -332,7 +347,8 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult GetLiveChannelVodPlaylist(const GetLiveChannelVodPlaylistReq& req, - GetLiveChannelVodPlaylistResp* resp); + GetLiveChannelVodPlaylistResp* resp, + bool change_backup_domain = false); /// \brief 指定通道生成一个可供点播例用的播放列表 /// @@ -341,27 +357,31 @@ class ObjectOp : public BaseOp { /// /// \return 返回HTTP请求的状态码及错误信息 CosResult PostLiveChannelVodPlaylist(const PostLiveChannelVodPlaylistReq& req, - PostLiveChannelVodPlaylistResp* resp); + PostLiveChannelVodPlaylistResp* resp, + bool change_backup_domain = false); /// \brief 异步多线程下载,handler处理回调 CosResult MultiThreadDownload(const GetObjectByFileReq& req, GetObjectByFileResp* resp, - const SharedTransferHandler& handler = nullptr); + const SharedTransferHandler& handler = nullptr, + bool change_backup_domain = false); /* Resumable接口 */ /// \brief 支持断点下载 CosResult ResumableGetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp, - const SharedTransferHandler& handler = nullptr); + const SharedTransferHandler& handler = nullptr, + bool change_backup_domain = false); /*批量及目录操作接口*/ CosResult PutObjects(const PutObjectsByDirectoryReq& req, - PutObjectsByDirectoryResp* resp); + PutObjectsByDirectoryResp* resp, + bool change_backup_domain = false); - CosResult PutDirectory(const PutDirectoryReq& req, PutDirectoryResp* resp); + CosResult PutDirectory(const PutDirectoryReq& req, PutDirectoryResp* resp, bool change_backup_domain = false); - CosResult MoveObject(const MoveObjectReq& req); + CosResult MoveObject(const MoveObjectReq& req, bool change_backup_domain = false); /*数据处理接口*/ @@ -404,7 +424,8 @@ class ObjectOp : public BaseOp { const std::vector& already_exist_parts, bool resume_flag, std::vector* etags_ptr, std::vector* part_numbers_ptr, - const SharedTransferHandler& handler = nullptr); + const SharedTransferHandler& handler = nullptr, + bool change_backup_domain = false); /// \brief 读取文件内容, 并返回读取的长度 // uint64_t GetContent(const std::string& src, std::string* file_content) const; diff --git a/include/trsf/transfer_handler.h b/include/trsf/transfer_handler.h index db85cb2..d58f473 100644 --- a/include/trsf/transfer_handler.h +++ b/include/trsf/transfer_handler.h @@ -78,6 +78,7 @@ enum class TransferStatus { COMPLETED, // Operation either failed or was canceled and a user deleted the multi-part // upload . + RETRY, ABORTED }; diff --git a/include/util/retry_util.h b/include/util/retry_util.h new file mode 100644 index 0000000..94eea07 --- /dev/null +++ b/include/util/retry_util.h @@ -0,0 +1,13 @@ +#ifndef RETRT_UTIL_H +#define RETRT_UTIL_H +#include "op/cos_result.h" + +namespace qcloud_cos { + +class RetryUtil { + public: + static bool ShouldRetryWithChangeDomain(CosResult result); +}; +} // namespace qcloud_cos + +#endif \ No newline at end of file diff --git a/src/cos_api.cpp b/src/cos_api.cpp index 43ba486..7e09ac3 100644 --- a/src/cos_api.cpp +++ b/src/cos_api.cpp @@ -8,6 +8,7 @@ #include "trsf/async_task.h" #include "util/file_util.h" #include "util/string_util.h" +#include "util/retry_util.h" #include namespace qcloud_cos { @@ -102,211 +103,382 @@ CosResult CosAPI::GetService(const GetServiceReq& req, GetServiceResp* resp) { } CosResult CosAPI::HeadBucket(const HeadBucketReq& req, HeadBucketResp* resp) { - return m_bucket_op.HeadBucket(req, resp); + CosResult result = m_bucket_op.HeadBucket(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.HeadBucket(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucket(const PutBucketReq& req, PutBucketResp* resp) { - return m_bucket_op.PutBucket(req, resp); + CosResult result = m_bucket_op.PutBucket(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucket(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucket(const GetBucketReq& req, GetBucketResp* resp) { - return m_bucket_op.GetBucket(req, resp); + CosResult result = m_bucket_op.GetBucket(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucket(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::ListMultipartUpload(const ListMultipartUploadReq& req, ListMultipartUploadResp* resp) { - return m_bucket_op.ListMultipartUpload(req, resp); + CosResult result = m_bucket_op.ListMultipartUpload(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.ListMultipartUpload(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteBucket(const DeleteBucketReq& req, DeleteBucketResp* resp) { - return m_bucket_op.DeleteBucket(req, resp); + CosResult result = m_bucket_op.DeleteBucket(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.DeleteBucket(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketVersioning(const GetBucketVersioningReq& req, GetBucketVersioningResp* resp) { - return m_bucket_op.GetBucketVersioning(req, resp); + CosResult result = m_bucket_op.GetBucketVersioning(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketVersioning(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketVersioning(const PutBucketVersioningReq& req, PutBucketVersioningResp* resp) { - return m_bucket_op.PutBucketVersioning(req, resp); + CosResult result = m_bucket_op.PutBucketVersioning(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketVersioning(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketReplication(const GetBucketReplicationReq& req, GetBucketReplicationResp* resp) { - return m_bucket_op.GetBucketReplication(req, resp); + CosResult result = m_bucket_op.GetBucketReplication(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketReplication(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketReplication(const PutBucketReplicationReq& req, PutBucketReplicationResp* resp) { - return m_bucket_op.PutBucketReplication(req, resp); + CosResult result = m_bucket_op.PutBucketReplication(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketReplication(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteBucketReplication(const DeleteBucketReplicationReq& req, DeleteBucketReplicationResp* resp) { - return m_bucket_op.DeleteBucketReplication(req, resp); + CosResult result = m_bucket_op.DeleteBucketReplication(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.DeleteBucketReplication(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketLifecycle(const GetBucketLifecycleReq& req, GetBucketLifecycleResp* resp) { - return m_bucket_op.GetBucketLifecycle(req, resp); + CosResult result = m_bucket_op.GetBucketLifecycle(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketLifecycle(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketLifecycle(const PutBucketLifecycleReq& req, PutBucketLifecycleResp* resp) { - return m_bucket_op.PutBucketLifecycle(req, resp); + CosResult result = m_bucket_op.PutBucketLifecycle(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketLifecycle(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteBucketLifecycle(const DeleteBucketLifecycleReq& req, DeleteBucketLifecycleResp* resp) { - return m_bucket_op.DeleteBucketLifecycle(req, resp); + CosResult result = m_bucket_op.DeleteBucketLifecycle(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.DeleteBucketLifecycle(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketACL(const GetBucketACLReq& req, GetBucketACLResp* resp) { - return m_bucket_op.GetBucketACL(req, resp); + CosResult result = m_bucket_op.GetBucketACL(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketACL(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketACL(const PutBucketACLReq& req, PutBucketACLResp* resp) { - return m_bucket_op.PutBucketACL(req, resp); + CosResult result = m_bucket_op.PutBucketACL(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketACL(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketPolicy(const PutBucketPolicyReq& req, PutBucketPolicyResp* resp) { - return m_bucket_op.PutBucketPolicy(req, resp); + CosResult result = m_bucket_op.PutBucketPolicy(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketPolicy(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketPolicy(const GetBucketPolicyReq& req, GetBucketPolicyResp* resp) { - return m_bucket_op.GetBucketPolicy(req, resp); + CosResult result = m_bucket_op.GetBucketPolicy(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketPolicy(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteBucketPolicy(const DeleteBucketPolicyReq& req, DeleteBucketPolicyResp* resp) { - return m_bucket_op.DeleteBucketPolicy(req, resp); + CosResult result = m_bucket_op.DeleteBucketPolicy(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.DeleteBucketPolicy(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketCORS(const GetBucketCORSReq& req, GetBucketCORSResp* resp) { - return m_bucket_op.GetBucketCORS(req, resp); + CosResult result = m_bucket_op.GetBucketCORS(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketCORS(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketCORS(const PutBucketCORSReq& req, PutBucketCORSResp* resp) { - return m_bucket_op.PutBucketCORS(req, resp); + CosResult result = m_bucket_op.PutBucketCORS(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketCORS(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteBucketCORS(const DeleteBucketCORSReq& req, DeleteBucketCORSResp* resp) { - return m_bucket_op.DeleteBucketCORS(req, resp); + CosResult result = m_bucket_op.DeleteBucketCORS(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.DeleteBucketCORS(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketReferer(const PutBucketRefererReq& req, PutBucketRefererResp* resp) { - return m_bucket_op.PutBucketReferer(req, resp); + CosResult result = m_bucket_op.PutBucketReferer(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketReferer(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketReferer(const GetBucketRefererReq& req, GetBucketRefererResp* resp) { - return m_bucket_op.GetBucketReferer(req, resp); + CosResult result = m_bucket_op.GetBucketReferer(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketReferer(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketLogging(const PutBucketLoggingReq& req, PutBucketLoggingResp* resp) { - return m_bucket_op.PutBucketLogging(req, resp); + CosResult result = m_bucket_op.PutBucketLogging(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketLogging(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketLogging(const GetBucketLoggingReq& req, GetBucketLoggingResp* resp) { - return m_bucket_op.GetBucketLogging(req, resp); + CosResult result = m_bucket_op.GetBucketLogging(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketLogging(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketDomain(const PutBucketDomainReq& req, PutBucketDomainResp* resp) { - return m_bucket_op.PutBucketDomain(req, resp); + CosResult result = m_bucket_op.PutBucketDomain(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketDomain(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketDomain(const GetBucketDomainReq& req, GetBucketDomainResp* resp) { - return m_bucket_op.GetBucketDomain(req, resp); + CosResult result = m_bucket_op.GetBucketDomain(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketDomain(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketWebsite(const PutBucketWebsiteReq& req, PutBucketWebsiteResp* resp) { - return m_bucket_op.PutBucketWebsite(req, resp); + CosResult result = m_bucket_op.PutBucketWebsite(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketWebsite(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketWebsite(const GetBucketWebsiteReq& req, GetBucketWebsiteResp* resp) { - return m_bucket_op.GetBucketWebsite(req, resp); + CosResult result = m_bucket_op.GetBucketWebsite(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketWebsite(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteBucketWebsite(const DeleteBucketWebsiteReq& req, DeleteBucketWebsiteResp* resp) { - return m_bucket_op.DeleteBucketWebsite(req, resp); + CosResult result = m_bucket_op.DeleteBucketWebsite(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.DeleteBucketWebsite(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketTagging(const PutBucketTaggingReq& req, PutBucketTaggingResp* resp) { - return m_bucket_op.PutBucketTagging(req, resp); + CosResult result = m_bucket_op.PutBucketTagging(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketTagging(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketTagging(const GetBucketTaggingReq& req, GetBucketTaggingResp* resp) { - return m_bucket_op.GetBucketTagging(req, resp); + CosResult result = m_bucket_op.GetBucketTagging(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketTagging(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteBucketTagging(const DeleteBucketTaggingReq& req, DeleteBucketTaggingResp* resp) { - return m_bucket_op.DeleteBucketTagging(req, resp); + CosResult result = m_bucket_op.DeleteBucketTagging(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.DeleteBucketTagging(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketInventory(const PutBucketInventoryReq& req, PutBucketInventoryResp* resp) { - return m_bucket_op.PutBucketInventory(req, resp); + CosResult result = m_bucket_op.PutBucketInventory(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketInventory(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketInventory(const GetBucketInventoryReq& req, GetBucketInventoryResp* resp) { - return m_bucket_op.GetBucketInventory(req, resp); + CosResult result = m_bucket_op.GetBucketInventory(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketInventory(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::ListBucketInventoryConfigurations( const ListBucketInventoryConfigurationsReq& req, ListBucketInventoryConfigurationsResp* resp) { - return m_bucket_op.ListBucketInventoryConfigurations(req, resp); + CosResult result = m_bucket_op.ListBucketInventoryConfigurations(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.ListBucketInventoryConfigurations(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteBucketInventory(const DeleteBucketInventoryReq& req, DeleteBucketInventoryResp* resp) { - return m_bucket_op.DeleteBucketInventory(req, resp); + CosResult result = m_bucket_op.DeleteBucketInventory(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.DeleteBucketInventory(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketObjectVersions(const GetBucketObjectVersionsReq& req, GetBucketObjectVersionsResp* resp) { - return m_bucket_op.GetBucketObjectVersions(req, resp); + CosResult result = m_bucket_op.GetBucketObjectVersions(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketObjectVersions(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutObject(const PutObjectByFileReq& req, PutObjectByFileResp* resp) { - return m_object_op.PutObject(req, resp); + CosResult result = m_object_op.PutObject(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PutObject(req, resp, nullptr, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutObject(const PutObjectByStreamReq& req, PutObjectByStreamResp* resp) { - return m_object_op.PutObject(req, resp); + CosResult result = m_object_op.PutObject(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PutObject(req, resp, nullptr, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetObject(const GetObjectByStreamReq& req, GetObjectByStreamResp* resp) { - return m_object_op.GetObject(req, resp); + CosResult result = m_object_op.GetObject(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + std::streambuf* os_buf = req.GetStream().rdbuf(); + os_buf->pubseekpos(0, std::ios_base::out); + req.GetStream().clear(); + result = m_object_op.GetObject(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp) { - return m_object_op.GetObject(req, resp); + CosResult result = m_object_op.GetObject(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.GetObject(req, resp, nullptr, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::MultiGetObject(const MultiGetObjectReq& req, @@ -342,61 +514,108 @@ std::string CosAPI::GetObjectUrl(const std::string& bucket, CosResult CosAPI::DeleteObject(const DeleteObjectReq& req, DeleteObjectResp* resp) { - return m_object_op.DeleteObject(req, resp); + CosResult result = m_object_op.DeleteObject(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.DeleteObject(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteObjects(const DeleteObjectsReq& req, DeleteObjectsResp* resp) { - return m_object_op.DeleteObjects(req, resp); + CosResult result = m_object_op.DeleteObjects(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.DeleteObjects(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::HeadObject(const HeadObjectReq& req, HeadObjectResp* resp) { - return m_object_op.HeadObject(req, resp); + CosResult result = m_object_op.HeadObject(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.HeadObject(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::InitMultiUpload(const InitMultiUploadReq& req, InitMultiUploadResp* resp) { - return m_object_op.InitMultiUpload(req, resp); + CosResult result = m_object_op.InitMultiUpload(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.InitMultiUpload(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::UploadPartData(const UploadPartDataReq& req, UploadPartDataResp* resp) { - return m_object_op.UploadPartData(req, resp); + CosResult result = m_object_op.UploadPartData(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.UploadPartData(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::UploadPartCopyData(const UploadPartCopyDataReq& req, UploadPartCopyDataResp* resp) { - return m_object_op.UploadPartCopyData(req, resp); + CosResult result = m_object_op.UploadPartCopyData(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.UploadPartCopyData(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::CompleteMultiUpload(const CompleteMultiUploadReq& req, CompleteMultiUploadResp* resp) { - return m_object_op.CompleteMultiUpload(req, resp); + CosResult result = m_object_op.CompleteMultiUpload(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.CompleteMultiUpload(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::MultiPutObject(const MultiPutObjectReq& req, MultiPutObjectResp* resp) { - return m_object_op.MultiUploadObject(static_cast(req), - resp); + CosResult result = m_object_op.MultiUploadObject(static_cast(req), resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.MultiUploadObject(static_cast(req), resp, nullptr, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::AbortMultiUpload(const AbortMultiUploadReq& req, AbortMultiUploadResp* resp) { - return m_object_op.AbortMultiUpload(req, resp); + CosResult result = m_object_op.AbortMultiUpload(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.AbortMultiUpload(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::ListParts(const ListPartsReq& req, ListPartsResp* resp) { - return m_object_op.ListParts(req, resp); + CosResult result = m_object_op.ListParts(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.ListParts(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetObjectACL(const GetObjectACLReq& req, GetObjectACLResp* resp) { - return m_object_op.GetObjectACL(req, resp); + CosResult result = m_object_op.GetObjectACL(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.GetObjectACL(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutObjectACL(const PutObjectACLReq& req, PutObjectACLResp* resp) { - return m_object_op.PutObjectACL(req, resp); + CosResult result = m_object_op.PutObjectACL(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PutObjectACL(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutObjectTagging(const PutObjectTaggingReq& req, @@ -417,26 +636,46 @@ CosResult CosAPI::DeleteObjectTagging(const DeleteObjectTaggingReq& req, CosResult CosAPI::PutObjectCopy(const PutObjectCopyReq& req, PutObjectCopyResp* resp) { - return m_object_op.PutObjectCopy(req, resp); + CosResult result = m_object_op.PutObjectCopy(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PutObjectCopy(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::Copy(const CopyReq& req, CopyResp* resp) { - return m_object_op.Copy(req, resp); + CosResult result = m_object_op.Copy(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.Copy(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PostObjectRestore(const PostObjectRestoreReq& req, PostObjectRestoreResp* resp) { - return m_object_op.PostObjectRestore(req, resp); + CosResult result = m_object_op.PostObjectRestore(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PostObjectRestore(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::OptionsObject(const OptionsObjectReq& req, OptionsObjectResp* resp) { - return m_object_op.OptionsObject(req, resp); + CosResult result = m_object_op.OptionsObject(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.OptionsObject(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::SelectObjectContent(const SelectObjectContentReq& req, SelectObjectContentResp* resp) { - return m_object_op.SelectObjectContent(req, resp); + CosResult result = m_object_op.SelectObjectContent(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.SelectObjectContent(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::AppendObject(const AppendObjectReq& req, @@ -446,7 +685,11 @@ CosResult CosAPI::AppendObject(const AppendObjectReq& req, CosResult CosAPI::PutLiveChannel(const PutLiveChannelReq& req, PutLiveChannelResp* resp) { - return m_object_op.PutLiveChannel(req, resp); + CosResult result = m_object_op.PutLiveChannel(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PutLiveChannel(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } std::string CosAPI::GetRtmpSignedPublishUrl( @@ -463,61 +706,105 @@ std::string CosAPI::GetRtmpSignedPublishUrl( CosResult CosAPI::PutLiveChannelSwitch(const PutLiveChannelSwitchReq& req, PutLiveChannelSwitchResp* resp) { - return m_object_op.PutLiveChannelSwitch(req, resp); + CosResult result = m_object_op.PutLiveChannelSwitch(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PutLiveChannelSwitch(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetLiveChannel(const GetLiveChannelReq& req, GetLiveChannelResp* resp) { - return m_object_op.GetLiveChannel(req, resp); + CosResult result = m_object_op.GetLiveChannel(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.GetLiveChannel(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetLiveChannelHistory(const GetLiveChannelHistoryReq& req, GetLiveChannelHistoryResp* resp) { - return m_object_op.GetLiveChannelHistory(req, resp); + CosResult result = m_object_op.GetLiveChannelHistory(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.GetLiveChannelHistory(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetLiveChannelStatus(const GetLiveChannelStatusReq& req, GetLiveChannelStatusResp* resp) { - return m_object_op.GetLiveChannelStatus(req, resp); + CosResult result = m_object_op.GetLiveChannelStatus(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.GetLiveChannelStatus(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteLiveChannel(const DeleteLiveChannelReq& req, DeleteLiveChannelResp* resp) { - return m_object_op.DeleteLiveChannel(req, resp); + CosResult result = m_object_op.DeleteLiveChannel(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.DeleteLiveChannel(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetLiveChannelVodPlaylist(const GetLiveChannelVodPlaylistReq& req, GetLiveChannelVodPlaylistResp* resp) { - return m_object_op.GetLiveChannelVodPlaylist(req, resp); + CosResult result = m_object_op.GetLiveChannelVodPlaylist(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.GetLiveChannelVodPlaylist(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PostLiveChannelVodPlaylist(const PostLiveChannelVodPlaylistReq& req, PostLiveChannelVodPlaylistResp* resp) { - return m_object_op.PostLiveChannelVodPlaylist(req, resp); + CosResult result = m_object_op.PostLiveChannelVodPlaylist(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PostLiveChannelVodPlaylist(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::ListLiveChannel(const ListLiveChannelReq& req, ListLiveChannelResp* resp) { - return m_bucket_op.ListLiveChannel(req, resp); + CosResult result = m_bucket_op.ListLiveChannel(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.ListLiveChannel(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketIntelligentTiering(const PutBucketIntelligentTieringReq& req, PutBucketIntelligentTieringResp* resp) { - return m_bucket_op.PutBucketIntelligentTiering(req, resp); + CosResult result = m_bucket_op.PutBucketIntelligentTiering(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.PutBucketIntelligentTiering(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::GetBucketIntelligentTiering(const GetBucketIntelligentTieringReq& req, GetBucketIntelligentTieringResp* resp) { - return m_bucket_op.GetBucketIntelligentTiering(req, resp); + CosResult result = m_bucket_op.GetBucketIntelligentTiering(req, resp); + if (m_bucket_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_bucket_op.GetBucketIntelligentTiering(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::ResumableGetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp) { - return m_object_op.ResumableGetObject(req, resp); + CosResult result = m_object_op.ResumableGetObject(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.ResumableGetObject(req, resp, nullptr, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } SharedAsyncContext CosAPI::AsyncPutObject(const AsyncPutObjectReq& req) { @@ -527,6 +814,9 @@ SharedAsyncContext CosAPI::AsyncPutObject(const AsyncPutObjectReq& req) { TaskFunc fn = [=]() { PutObjectByFileResp resp; m_object_op.PutObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.PutObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; GetGlobalTaskManager().start(new AsyncTask(std::move(fn))); SharedAsyncContext context(new AsyncContext(handler)); @@ -540,6 +830,9 @@ SharedAsyncContext CosAPI::AsyncPutObject(const AsyncPutObjectReq& req, Poco::Ta TaskFunc fn = [=]() { PutObjectByFileResp resp; m_object_op.PutObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.PutObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; taskManager = &GetGlobalTaskManager(); (*taskManager).start(new AsyncTask(std::move(fn))); @@ -557,6 +850,9 @@ SharedAsyncContext CosAPI::AsyncPutObject(const AsyncPutObjectByStreamReq& req) TaskFunc fn = [=]() { PutObjectByStreamResp resp; m_object_op.PutObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.PutObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; GetGlobalTaskManager().start(new AsyncTask(std::move(fn))); SharedAsyncContext context(new AsyncContext(handler)); @@ -573,6 +869,9 @@ SharedAsyncContext CosAPI::AsyncPutObject(const AsyncPutObjectByStreamReq& req, TaskFunc fn = [=]() { PutObjectByStreamResp resp; m_object_op.PutObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.PutObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; taskManager = &GetGlobalTaskManager(); (*taskManager).start(new AsyncTask(std::move(fn))); @@ -588,6 +887,9 @@ SharedAsyncContext CosAPI::AsyncMultiPutObject(const AsyncMultiPutObjectReq& req TaskFunc fn = [=]() { MultiPutObjectResp resp; m_object_op.MultiUploadObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.MultiUploadObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; GetGlobalTaskManager().start(new AsyncTask(std::move(fn))); SharedAsyncContext context(new AsyncContext(handler)); @@ -601,6 +903,9 @@ SharedAsyncContext CosAPI::AsyncMultiPutObject(const AsyncMultiPutObjectReq& req TaskFunc fn = [=]() { MultiPutObjectResp resp; m_object_op.MultiUploadObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.MultiUploadObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; taskManager = &GetGlobalTaskManager(); (*taskManager).start(new AsyncTask(std::move(fn))); @@ -614,6 +919,9 @@ SharedAsyncContext CosAPI::AsyncGetObject(const AsyncGetObjectReq& req) { TaskFunc fn = [=]() { GetObjectByFileResp resp; m_object_op.GetObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.GetObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; GetGlobalTaskManager().start(new AsyncTask(std::move(fn))); SharedAsyncContext context(new AsyncContext(handler)); @@ -626,6 +934,9 @@ SharedAsyncContext CosAPI::AsyncGetObject(const AsyncGetObjectReq& req, Poco::Ta TaskFunc fn = [=]() { GetObjectByFileResp resp; m_object_op.GetObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.GetObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; taskManager = &GetGlobalTaskManager(); (*taskManager).start(new AsyncTask(std::move(fn))); @@ -639,6 +950,9 @@ SharedAsyncContext CosAPI::AsyncResumableGetObject(const AsyncGetObjectReq& req) TaskFunc fn = [=]() { GetObjectByFileResp resp; m_object_op.ResumableGetObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.ResumableGetObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; GetGlobalTaskManager().start(new AsyncTask(std::move(fn))); SharedAsyncContext context(new AsyncContext(handler)); @@ -651,6 +965,9 @@ SharedAsyncContext CosAPI::AsyncResumableGetObject(const AsyncGetObjectReq& req, TaskFunc fn = [=]() { GetObjectByFileResp resp; m_object_op.ResumableGetObject(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.ResumableGetObject(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; taskManager = &GetGlobalTaskManager(); (*taskManager).start(new AsyncTask(std::move(fn))); @@ -664,6 +981,9 @@ SharedAsyncContext CosAPI::AsyncMultiGetObject(const AsyncMultiGetObjectReq& req TaskFunc fn = [=]() { GetObjectByFileResp resp; m_object_op.MultiThreadDownload(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.MultiThreadDownload(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; GetGlobalTaskManager().start(new AsyncTask(std::move(fn))); SharedAsyncContext context(new AsyncContext(handler)); @@ -676,6 +996,9 @@ SharedAsyncContext CosAPI::AsyncMultiGetObject(const AsyncMultiGetObjectReq& req TaskFunc fn = [=]() { GetObjectByFileResp resp; m_object_op.MultiThreadDownload(req, &resp, handler); + if(handler->GetStatus() == TransferStatus::RETRY){ + m_object_op.MultiThreadDownload(req, &resp, handler, COS_CHANGE_BACKUP_DOMAIN); + } }; taskManager = &GetGlobalTaskManager(); (*taskManager).start(new AsyncTask(std::move(fn))); @@ -685,12 +1008,20 @@ SharedAsyncContext CosAPI::AsyncMultiGetObject(const AsyncMultiGetObjectReq& req CosResult CosAPI::PutObjects(const PutObjectsByDirectoryReq& req, PutObjectsByDirectoryResp* resp) { - return m_object_op.PutObjects(req, resp); + CosResult result = m_object_op.PutObjects(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PutObjects(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutDirectory(const PutDirectoryReq& req, PutDirectoryResp* resp) { - return m_object_op.PutDirectory(req, resp); + CosResult result = m_object_op.PutDirectory(req, resp); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.PutDirectory(req, resp, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::DeleteObjects(const DeleteObjectsByPrefixReq& req, @@ -718,6 +1049,8 @@ CosResult CosAPI::DeleteObjects(const DeleteObjectsByPrefixReq& req, get_bucket_req.SetMarker(get_bucket_resp.GetNextMarker()); is_truncated = get_bucket_resp.IsTruncated(); + }else{ + get_bucket_result = m_bucket_op.GetBucket(get_bucket_req, &get_bucket_resp, COS_CHANGE_BACKUP_DOMAIN); } } while (get_bucket_result.IsSucc() && is_truncated); @@ -725,7 +1058,11 @@ CosResult CosAPI::DeleteObjects(const DeleteObjectsByPrefixReq& req, }; CosResult CosAPI::MoveObject(const MoveObjectReq& req) { - return m_object_op.MoveObject(req); + CosResult result = m_object_op.MoveObject(req); + if (m_object_op.UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = m_object_op.MoveObject(req, COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult CosAPI::PutBucketToCI(const PutBucketToCIReq& req, PutBucketToCIResp* resp) { diff --git a/src/cos_sys_config.cpp b/src/cos_sys_config.cpp index e959ad9..c81ba0a 100644 --- a/src/cos_sys_config.cpp +++ b/src/cos_sys_config.cpp @@ -57,6 +57,8 @@ unsigned CosSysConfig::m_dns_cache_expire_seconds = 600; // dns cache大小 unsigned CosSysConfig::m_dns_cache_size = 1000; +bool CosSysConfig::m_retry_change_domain = true; + std::mutex m_intranet_addr_lock; std::mutex m_dest_domain_lock; @@ -222,7 +224,7 @@ void CosSysConfig::SetIntranetAddr(const std::string& intranet_addr) { } std::string CosSysConfig::GetHost(uint64_t app_id, const std::string& region, - const std::string& bucket_name) { + const std::string& bucket_name, bool change_backup_domain) { std::string format_region(""); if (region == "cn-east" || region == "cn-north" || region == "cn-south" || region == "cn-southwest" || region == "cn-south-2" || region == "sg" || @@ -233,11 +235,12 @@ std::string CosSysConfig::GetHost(uint64_t app_id, const std::string& region, } std::string app_id_suffix = "-" + StringUtil::Uint64ToString(app_id); + std::string domain_suffix = change_backup_domain ? ".tencentcos.cn" : ".myqcloud.com"; if (app_id == 0 || StringUtil::StringEndsWith(bucket_name, app_id_suffix)) { - return bucket_name + "." + format_region + ".myqcloud.com"; + return bucket_name + "." + format_region + domain_suffix; } - return bucket_name + app_id_suffix + "." + format_region + ".myqcloud.com"; + return bucket_name + app_id_suffix + "." + format_region + domain_suffix; } std::string CosSysConfig::GetCIHost(const std::string& bucket_name, @@ -297,4 +300,11 @@ void CosSysConfig::SetDnsCacheSize(unsigned cache_size) { unsigned CosSysConfig::GetDnsCacheSize() { return m_dns_cache_size; } +void CosSysConfig::SetRetryChangeDomain(bool retry_change_domain){ + m_retry_change_domain = retry_change_domain; +} + +bool CosSysConfig::GetRetryChangeDomain(){ + return m_retry_change_domain; +} } // namespace qcloud_cos diff --git a/src/op/base_op.cpp b/src/op/base_op.cpp index a004e31..2b7d736 100644 --- a/src/op/base_op.cpp +++ b/src/op/base_op.cpp @@ -9,7 +9,7 @@ #include #include - +#include #include "cos_sys_config.h" #include "request/base_req.h" #include "response/base_resp.h" @@ -49,6 +49,33 @@ bool BaseOp::IsDomainSameToHost() const{ m_config->IsDomainSameToHost() : CosSysConfig::IsDomainSameToHost(); } +bool BaseOp::UseDefaultDomain() const{ + if (m_config && m_config->GetSetIntranetOnce() && m_config->IsUseIntranet() && !m_config->GetIntranetAddr().empty() + || CosSysConfig::IsUseIntranet() && !CosSysConfig::GetIntranetAddr().empty() + || (!m_config->GetDestDomain().empty()) + || !CosSysConfig::GetDestDomain().empty() + || m_config->GetRegion().compare("accelerate") == 0) { + return false; + } + return true; +} + +bool BaseOp::IsDefaultHost(const std::string& host) const { + std::regex host_pattern(R"(^([\w-]+)-([\w-]+)\.cos\.([\w-]+)-([\w-]+)\.myqcloud\.com$)"); + return std::regex_match(host, host_pattern); +} +std::string BaseOp::ChangeHostSuffix(const std::string& host) { + const std::string old_suffix = ".myqcloud.com"; + const std::string new_suffix = ".tencentcos.cn"; + + size_t suffix_pos = host.rfind(old_suffix); + if (suffix_pos != std::string::npos) { + std::string new_host = host.substr(0, suffix_pos) + new_suffix; + return new_host; + } else { + return host; + } +} CosResult BaseOp::NormalAction(const std::string& host, const std::string& path, const BaseReq& req, const std::string& req_body, bool check_body, BaseResp* resp, bool is_ci_req) { diff --git a/src/op/bucket_op.cpp b/src/op/bucket_op.cpp index 9026c40..c28775c 100644 --- a/src/op/bucket_op.cpp +++ b/src/op/bucket_op.cpp @@ -6,8 +6,9 @@ // Description: #include "op/bucket_op.h" - +#include "cos_defines.h" #include "util/codec_util.h" +#include "util/retry_util.h" namespace qcloud_cos { @@ -18,6 +19,11 @@ bool BucketOp::IsBucketExist(const std::string& bucket_name) { if (result.IsSucc()) { return true; + }else if (UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = HeadBucket(req, &resp, COS_CHANGE_BACKUP_DOMAIN); + if (result.IsSucc()) { + return true; + } } return false; } @@ -30,60 +36,63 @@ std::string BucketOp::GetBucketLocation(const std::string& bucket_name) { if (result.IsSucc()) { return resp.GetLocation(); } - + result = GetBucketLocation(req, &resp, COS_CHANGE_BACKUP_DOMAIN); + if (result.IsSucc()) { + return resp.GetLocation(); + } return ""; } -CosResult BucketOp::HeadBucket(const HeadBucketReq& req, HeadBucketResp* resp) { +CosResult BucketOp::HeadBucket(const HeadBucketReq& req, HeadBucketResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } -CosResult BucketOp::PutBucket(const PutBucketReq& req, PutBucketResp* resp) { +CosResult BucketOp::PutBucket(const PutBucketReq& req, PutBucketResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body = req.GetBody(); return NormalAction(host, path, req, req_body, false, resp); } -CosResult BucketOp::GetBucket(const GetBucketReq& req, GetBucketResp* resp) { +CosResult BucketOp::GetBucket(const GetBucketReq& req, GetBucketResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::ListMultipartUpload(const ListMultipartUploadReq& req, - ListMultipartUploadResp* resp) { + ListMultipartUploadResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::DeleteBucket(const DeleteBucketReq& req, - DeleteBucketResp* resp) { + DeleteBucketResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::GetBucketVersioning(const GetBucketVersioningReq& req, - GetBucketVersioningResp* resp) { + GetBucketVersioningResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketVersioning(const PutBucketVersioningReq& req, - PutBucketVersioningResp* resp) { + PutBucketVersioningResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; @@ -103,17 +112,17 @@ CosResult BucketOp::PutBucketVersioning(const PutBucketVersioningReq& req, } CosResult BucketOp::GetBucketReplication(const GetBucketReplicationReq& req, - GetBucketReplicationResp* resp) { + GetBucketReplicationResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketReplication(const PutBucketReplicationReq& req, - PutBucketReplicationResp* resp) { + PutBucketReplicationResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; @@ -133,25 +142,25 @@ CosResult BucketOp::PutBucketReplication(const PutBucketReplicationReq& req, } CosResult BucketOp::DeleteBucketReplication( - const DeleteBucketReplicationReq& req, DeleteBucketReplicationResp* resp) { + const DeleteBucketReplicationReq& req, DeleteBucketReplicationResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::GetBucketLifecycle(const GetBucketLifecycleReq& req, - GetBucketLifecycleResp* resp) { + GetBucketLifecycleResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketLifecycle(const PutBucketLifecycleReq& req, - PutBucketLifecycleResp* resp) { + PutBucketLifecycleResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; @@ -171,25 +180,25 @@ CosResult BucketOp::PutBucketLifecycle(const PutBucketLifecycleReq& req, } CosResult BucketOp::DeleteBucketLifecycle(const DeleteBucketLifecycleReq& req, - DeleteBucketLifecycleResp* resp) { + DeleteBucketLifecycleResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::GetBucketACL(const GetBucketACLReq& req, - GetBucketACLResp* resp) { + GetBucketACLResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketACL(const PutBucketACLReq& req, - PutBucketACLResp* resp) { + PutBucketACLResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); CosResult result; @@ -216,9 +225,9 @@ CosResult BucketOp::PutBucketACL(const PutBucketACLReq& req, } CosResult BucketOp::PutBucketPolicy(const PutBucketPolicyReq& req, - PutBucketPolicyResp* resp) { + PutBucketPolicyResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body = req.GetBody(); @@ -232,33 +241,33 @@ CosResult BucketOp::PutBucketPolicy(const PutBucketPolicyReq& req, } CosResult BucketOp::GetBucketPolicy(const GetBucketPolicyReq& req, - GetBucketPolicyResp* resp) { + GetBucketPolicyResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::DeleteBucketPolicy(const DeleteBucketPolicyReq& req, - DeleteBucketPolicyResp* resp) { + DeleteBucketPolicyResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::GetBucketCORS(const GetBucketCORSReq& req, - GetBucketCORSResp* resp) { + GetBucketCORSResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketCORS(const PutBucketCORSReq& req, - PutBucketCORSResp* resp) { + PutBucketCORSResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; @@ -278,33 +287,33 @@ CosResult BucketOp::PutBucketCORS(const PutBucketCORSReq& req, } CosResult BucketOp::DeleteBucketCORS(const DeleteBucketCORSReq& req, - DeleteBucketCORSResp* resp) { + DeleteBucketCORSResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::GetBucketLocation(const GetBucketLocationReq& req, - GetBucketLocationResp* resp) { + GetBucketLocationResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::GetBucketObjectVersions( - const GetBucketObjectVersionsReq& req, GetBucketObjectVersionsResp* resp) { + const GetBucketObjectVersionsReq& req, GetBucketObjectVersionsResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketLogging(const PutBucketLoggingReq& req, - PutBucketLoggingResp* resp) { + PutBucketLoggingResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; @@ -323,18 +332,18 @@ CosResult BucketOp::PutBucketLogging(const PutBucketLoggingReq& req, } CosResult BucketOp::GetBucketLogging(const GetBucketLoggingReq& req, - GetBucketLoggingResp* resp) { + GetBucketLoggingResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketDomain(const PutBucketDomainReq& req, - PutBucketDomainResp* resp) { + PutBucketDomainResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; @@ -355,18 +364,18 @@ CosResult BucketOp::PutBucketDomain(const PutBucketDomainReq& req, } CosResult BucketOp::GetBucketDomain(const GetBucketDomainReq& req, - GetBucketDomainResp* resp) { + GetBucketDomainResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketWebsite(const PutBucketWebsiteReq& req, - PutBucketWebsiteResp* resp) { + PutBucketWebsiteResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; if (!req.GenerateRequestBody(&req_body)) { @@ -379,25 +388,25 @@ CosResult BucketOp::PutBucketWebsite(const PutBucketWebsiteReq& req, } CosResult BucketOp::GetBucketWebsite(const GetBucketWebsiteReq& req, - GetBucketWebsiteResp* resp) { + GetBucketWebsiteResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::DeleteBucketWebsite(const DeleteBucketWebsiteReq& req, - DeleteBucketWebsiteResp* resp) { + DeleteBucketWebsiteResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketTagging(const PutBucketTaggingReq& req, - PutBucketTaggingResp* resp) { + PutBucketTaggingResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; @@ -417,27 +426,27 @@ CosResult BucketOp::PutBucketTagging(const PutBucketTaggingReq& req, } CosResult BucketOp::GetBucketTagging(const GetBucketTaggingReq& req, - GetBucketTaggingResp* resp) { + GetBucketTaggingResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::DeleteBucketTagging(const DeleteBucketTaggingReq& req, - DeleteBucketTaggingResp* resp) { + DeleteBucketTaggingResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketInventory(const PutBucketInventoryReq& req, - PutBucketInventoryResp* resp) { + PutBucketInventoryResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); // id必须设置. @@ -464,9 +473,9 @@ CosResult BucketOp::PutBucketInventory(const PutBucketInventoryReq& req, } CosResult BucketOp::GetBucketInventory(const GetBucketInventoryReq& req, - GetBucketInventoryResp* resp) { + GetBucketInventoryResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); // id必须设置. @@ -481,18 +490,18 @@ CosResult BucketOp::GetBucketInventory(const GetBucketInventoryReq& req, CosResult BucketOp::ListBucketInventoryConfigurations( const ListBucketInventoryConfigurationsReq& req, - ListBucketInventoryConfigurationsResp* resp) { + ListBucketInventoryConfigurationsResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::DeleteBucketInventory(const DeleteBucketInventoryReq& req, - DeleteBucketInventoryResp* resp) { + DeleteBucketInventoryResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); // id必须设置. @@ -506,28 +515,28 @@ CosResult BucketOp::DeleteBucketInventory(const DeleteBucketInventoryReq& req, } CosResult BucketOp::PutBucketReferer(const PutBucketRefererReq& req, - PutBucketRefererResp* resp) { + PutBucketRefererResp* resp, bool change_backup_domain) { return ProcessReq(req, resp); } CosResult BucketOp::GetBucketReferer(const GetBucketRefererReq& req, - GetBucketRefererResp* resp) { + GetBucketRefererResp* resp, bool change_backup_domain) { return ProcessReq(req, resp); } CosResult BucketOp::ListLiveChannel(const ListLiveChannelReq& req, - ListLiveChannelResp* resp) { + ListLiveChannelResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult BucketOp::PutBucketIntelligentTiering( const PutBucketIntelligentTieringReq& req, - PutBucketIntelligentTieringResp* resp) { + PutBucketIntelligentTieringResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; @@ -547,9 +556,9 @@ CosResult BucketOp::PutBucketIntelligentTiering( CosResult BucketOp::GetBucketIntelligentTiering( const GetBucketIntelligentTieringReq& req, - GetBucketIntelligentTieringResp* resp) { + GetBucketIntelligentTieringResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } @@ -577,15 +586,41 @@ CosResult BucketOp::ProcessReq(const BucketReq& req, BaseResp* resp, result.SetErrorMsg("Generate request body fail."); return result; } - if (!req_body.empty()) { - std::string raw_md5 = CodecUtil::Base64Encode(CodecUtil::RawMd5(req_body)); - std::map additional_headers; - std::map additional_params; - additional_headers.insert(std::make_pair("Content-MD5", raw_md5)); - return NormalAction(host, path, req, additional_headers, additional_params, - req_body, false, resp, is_ci_req); + if (is_ci_req) { + if (!req_body.empty()) { + std::string raw_md5 = CodecUtil::Base64Encode(CodecUtil::RawMd5(req_body)); + std::map additional_headers; + std::map additional_params; + additional_headers.insert(std::make_pair("Content-MD5", raw_md5)); + return NormalAction(host, path, req, additional_headers, additional_params, + req_body, false, resp, is_ci_req); + } else { + return NormalAction(host, path, req, "", false, resp, is_ci_req); + } } else { - return NormalAction(host, path, req, "", false, resp, is_ci_req); + if (!req_body.empty()) { + std::string raw_md5 = CodecUtil::Base64Encode(CodecUtil::RawMd5(req_body)); + std::map additional_headers; + std::map additional_params; + additional_headers.insert(std::make_pair("Content-MD5", raw_md5)); + CosResult result = NormalAction(host, path, req, additional_headers, additional_params, + req_body, false, resp, is_ci_req); + if(UseDefaultDomain() && (RetryUtil::ShouldRetryWithChangeDomain(result))){ + host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), + req.GetBucketName(),COS_CHANGE_BACKUP_DOMAIN); + return NormalAction(host, path, req, additional_headers, additional_params, + req_body, false, resp, is_ci_req); + } + return result; + } else { + CosResult result = NormalAction(host, path, req, "", false, resp, is_ci_req); + if(UseDefaultDomain() && (RetryUtil::ShouldRetryWithChangeDomain(result))){ + host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), + req.GetBucketName(),COS_CHANGE_BACKUP_DOMAIN); + return NormalAction(host, path, req, "", false, resp, is_ci_req); + } + return result; + } } } diff --git a/src/op/object_op.cpp b/src/op/object_op.cpp index 78084c7..e26aa91 100644 --- a/src/op/object_op.cpp +++ b/src/op/object_op.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017, Tencent Inc. +// Copyright (c) 2017, Tencent Inc. // All rights reserved. // // Author: sevenyou @@ -39,7 +39,7 @@ #include "util/file_util.h" #include "util/http_sender.h" #include "util/string_util.h" - +#include "util/retry_util.h" namespace qcloud_cos { bool ObjectOp::IsObjectExist(const std::string& bucket_name, @@ -49,6 +49,11 @@ bool ObjectOp::IsObjectExist(const std::string& bucket_name, CosResult result = HeadObject(req, &resp); if (result.IsSucc()) { return true; + }else if (UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = HeadObject(req, &resp, COS_CHANGE_BACKUP_DOMAIN); + if (result.IsSucc()) { + return true; + } } return false; @@ -56,7 +61,8 @@ bool ObjectOp::IsObjectExist(const std::string& bucket_name, std::string ObjectOp::GetResumableUploadID(const PutObjectByFileReq& originReq, const std::string& bucket_name, - const std::string& object_name) { + const std::string& object_name, + bool change_backup_domain) { ListMultipartUploadReq req(bucket_name); req.SetPrefix(object_name); if (originReq.IsHttps()) { @@ -66,7 +72,7 @@ std::string ObjectOp::GetResumableUploadID(const PutObjectByFileReq& originReq, ListMultipartUploadResp resp; std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); CosResult result = NormalAction(host, path, req, "", false, &resp); @@ -327,17 +333,17 @@ void ObjectOp::SetResultAndLogError(CosResult& result, result.SetFail(); } -CosResult ObjectOp::HeadObject(const HeadObjectReq& req, HeadObjectResp* resp) { +CosResult ObjectOp::HeadObject(const HeadObjectReq& req, HeadObjectResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(),change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult ObjectOp::GetObject(const GetObjectByStreamReq& req, - GetObjectByStreamResp* resp) { + GetObjectByStreamResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::ostream& os = req.GetStream(); return DownloadAction(host, path, req, resp, os); @@ -345,10 +351,10 @@ CosResult ObjectOp::GetObject(const GetObjectByStreamReq& req, CosResult ObjectOp::GetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp, - const SharedTransferHandler& handler) { + const SharedTransferHandler& handler, bool change_backup_domain) { CosResult result; std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::ofstream ofs; #if defined(_WIN32) @@ -375,21 +381,29 @@ CosResult ObjectOp::GetObject(const GetObjectByFileReq& req, handler->UpdateStatus(TransferStatus::COMPLETED, result, resp->GetHeaders(), resp->GetBody()); } else if (handler) { - handler->UpdateStatus(TransferStatus::FAILED, result); + if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + handler->UpdateStatus(TransferStatus::RETRY, result); + }else{ + handler->UpdateStatus(TransferStatus::FAILED, result); + } } return result; } CosResult ObjectOp::MultiGetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp) { - return MultiThreadDownload(req, resp); + CosResult result = MultiThreadDownload(req, resp); + if(UseDefaultDomain() && (RetryUtil::ShouldRetryWithChangeDomain(result))){ + result = MultiThreadDownload(req, resp, nullptr , COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult ObjectOp::PutObject(const PutObjectByStreamReq& req, - PutObjectByStreamResp* resp, const SharedTransferHandler& handler) { + PutObjectByStreamResp* resp, const SharedTransferHandler& handler, bool change_backup_domain) { CosResult result; std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::map additional_headers; std::map additional_params; @@ -439,17 +453,21 @@ CosResult ObjectOp::PutObject(const PutObjectByStreamReq& req, handler->UpdateStatus(TransferStatus::COMPLETED, result, resp->GetHeaders(), resp->GetBody()); } else if(handler) { - handler->UpdateStatus(TransferStatus::FAILED, result); + if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + handler->UpdateStatus(TransferStatus::RETRY, result); + }else{ + handler->UpdateStatus(TransferStatus::FAILED, result); + } } return result; } CosResult ObjectOp::PutObject(const PutObjectByFileReq& req, PutObjectByFileResp* resp, - const SharedTransferHandler& handler) { + const SharedTransferHandler& handler, bool change_backup_domain) { CosResult result; std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::map additional_headers; std::map additional_params; @@ -507,13 +525,17 @@ CosResult ObjectOp::PutObject(const PutObjectByFileReq& req, handler->UpdateStatus(TransferStatus::COMPLETED, result, resp->GetHeaders(), resp->GetBody()); } else if (handler) { - handler->UpdateStatus(TransferStatus::FAILED, result); + if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + handler->UpdateStatus(TransferStatus::RETRY, result); + }else{ + handler->UpdateStatus(TransferStatus::FAILED, result); + } } return result; } CosResult ObjectOp::DeleteObject(const DeleteObjectReq& req, - DeleteObjectResp* resp) { + DeleteObjectResp* resp, bool change_backup_domain) { CosResult result; std::string object_name = req.GetObjectName(); if (object_name.empty()) { @@ -522,15 +544,15 @@ CosResult ObjectOp::DeleteObject(const DeleteObjectReq& req, } std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(),change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult ObjectOp::DeleteObjects(const DeleteObjectsReq& req, - DeleteObjectsResp* resp) { + DeleteObjectsResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); CosResult result; std::string req_body = ""; @@ -550,7 +572,7 @@ CosResult ObjectOp::DeleteObjects(const DeleteObjectsReq& req, CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req, MultiPutObjectResp* resp, - const SharedTransferHandler& handler) { + const SharedTransferHandler& handler, bool change_backup_domain) { if (!handler && !resp) { CosResult result; SetResultAndLogError(result, "Invalid input parameter"); @@ -562,7 +584,7 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req, bool resume_flag = false; std::vector already_exist_parts(kMaxPartNumbers); // check the breakpoint - std::string resume_uploadid = GetResumableUploadID(req ,bucket_name, object_name); + std::string resume_uploadid = GetResumableUploadID(req ,bucket_name, object_name, change_backup_domain); if (!resume_uploadid.empty()) { resume_flag = CheckUploadPart(req, bucket_name, object_name, resume_uploadid, already_exist_parts); @@ -606,12 +628,16 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req, init_req.AddHeaders(req.GetHeaders()); init_req.SetConnTimeoutInms(req.GetConnTimeoutInms()); init_req.SetRecvTimeoutInms(req.GetRecvTimeoutInms()); - init_result = InitMultiUpload(init_req, &init_resp); + init_result = InitMultiUpload(init_req, &init_resp, change_backup_domain); if (!init_result.IsSucc()) { std::string err_msg = "Init multipart upload failed"; SetResultAndLogError(init_result, err_msg); if (handler) { - handler->UpdateStatus(TransferStatus::FAILED, init_result); + if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(init_result)){ + handler->UpdateStatus(TransferStatus::RETRY, init_result); + }else{ + handler->UpdateStatus(TransferStatus::FAILED, init_result); + } } return init_result; } @@ -641,7 +667,7 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req, CosResult upload_result; upload_result = MultiThreadUpload(req, resume_uploadid, already_exist_parts, resume_flag, - &etags, &part_numbers, handler); + &etags, &part_numbers, handler, change_backup_domain); // Cancel way if (handler && !handler->ShouldContinue()) { SetResultAndLogError(upload_result, "Request canceled by user"); @@ -665,7 +691,11 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req, // return abort_result; // } if (handler) { - handler->UpdateStatus(TransferStatus::FAILED, upload_result); + if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(upload_result)){ + handler->UpdateStatus(TransferStatus::RETRY, upload_result); + }else{ + handler->UpdateStatus(TransferStatus::FAILED, upload_result); + } } return upload_result; } @@ -684,7 +714,7 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req, comp_req.SetCaLocation(req.GetCaLocation()); } - comp_result = CompleteMultiUpload(comp_req, &comp_resp); + comp_result = CompleteMultiUpload(comp_req, &comp_resp, change_backup_domain); // check crc64 if needed if (req.CheckCRC64() && comp_result.IsSucc() && !comp_resp.GetXCosHashCrc64Ecma().empty()) { @@ -718,7 +748,11 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req, } } else { if (handler) { - handler->UpdateStatus(TransferStatus::FAILED); + if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(comp_result)){ + handler->UpdateStatus(TransferStatus::RETRY); + }else{ + handler->UpdateStatus(TransferStatus::FAILED); + } } } @@ -726,9 +760,9 @@ CosResult ObjectOp::MultiUploadObject(const PutObjectByFileReq& req, } CosResult ObjectOp::InitMultiUpload(const InitMultiUploadReq& req, - InitMultiUploadResp* resp) { + InitMultiUploadResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::map additional_headers; std::map additional_params; @@ -738,10 +772,10 @@ CosResult ObjectOp::InitMultiUpload(const InitMultiUploadReq& req, } CosResult ObjectOp::UploadPartData(const UploadPartDataReq& req, - UploadPartDataResp* resp) { + UploadPartDataResp* resp, bool change_backup_domain) { CosResult result; std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::map additional_headers; std::map additional_params; @@ -775,10 +809,13 @@ CosResult ObjectOp::UploadPartData(const UploadPartDataReq& req, additional_headers.insert(std::make_pair("Content-MD5", encode_str)); } } + std::streampos pos = is.tellg(); result = UploadAction(host, path, req, additional_headers, additional_params, is, resp); + is.clear(); + is.seekg(pos); if (result.IsSucc() && is_check_md5 && !StringUtil::IsV4ETag(resp->GetEtag()) && md5_str != resp->GetEtag()) { result.SetFail(); @@ -794,9 +831,9 @@ CosResult ObjectOp::UploadPartData(const UploadPartDataReq& req, } CosResult ObjectOp::UploadPartCopyData(const UploadPartCopyDataReq& req, - UploadPartCopyDataResp* resp) { + UploadPartCopyDataResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::map additional_headers; std::map additional_params; @@ -809,9 +846,9 @@ CosResult ObjectOp::UploadPartCopyData(const UploadPartCopyDataReq& req, } CosResult ObjectOp::CompleteMultiUpload(const CompleteMultiUploadReq& req, - CompleteMultiUploadResp* resp) { + CompleteMultiUploadResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::string req_body; if (!req.GenerateRequestBody(&req_body)) { @@ -830,9 +867,9 @@ CosResult ObjectOp::CompleteMultiUpload(const CompleteMultiUploadReq& req, } CosResult ObjectOp::AbortMultiUpload(const AbortMultiUploadReq& req, - AbortMultiUploadResp* resp) { + AbortMultiUploadResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); std::map additional_headers; std::map additional_params; @@ -841,25 +878,25 @@ CosResult ObjectOp::AbortMultiUpload(const AbortMultiUploadReq& req, "", false, resp); } -CosResult ObjectOp::ListParts(const ListPartsReq& req, ListPartsResp* resp) { +CosResult ObjectOp::ListParts(const ListPartsReq& req, ListPartsResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult ObjectOp::GetObjectACL(const GetObjectACLReq& req, - GetObjectACLResp* resp) { + GetObjectACLResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult ObjectOp::PutObjectACL(const PutObjectACLReq& req, - PutObjectACLResp* resp) { + PutObjectACLResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); CosResult result; @@ -926,14 +963,14 @@ CosResult ObjectOp::DeleteObjectTagging(const DeleteObjectTaggingReq& req, } CosResult ObjectOp::PutObjectCopy(const PutObjectCopyReq& req, - PutObjectCopyResp* resp) { + PutObjectCopyResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", true, resp); } -CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp) { +CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp, bool change_backup_domain) { SDK_LOG_DBG("Copy request=%s", req.DebugString().c_str()); CosResult result; @@ -976,7 +1013,7 @@ CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp) { put_copy_req.SetConnTimeoutInms(req.GetConnTimeoutInms()); put_copy_req.SetRecvTimeoutInms(req.GetRecvTimeoutInms()); - result = PutObjectCopy(put_copy_req, &put_copy_resp); + result = PutObjectCopy(put_copy_req, &put_copy_resp, change_backup_domain); if (result.IsSucc()) { resp->CopyFrom(put_copy_resp); } @@ -989,6 +1026,9 @@ CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp) { head_req.SetRecvTimeoutInms(req.GetRecvTimeoutInms()); HeadObjectResp head_resp; std::string host = v[0]; + if (change_backup_domain && IsDefaultHost(host)){ + host = ChangeHostSuffix(host); + } std::string path = head_req.GetPath(); result = NormalAction(host, path, head_req, "", false, &head_resp); if (!result.IsSucc()) { @@ -1010,7 +1050,7 @@ CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp) { put_copy_req.SetConnTimeoutInms(req.GetConnTimeoutInms()); put_copy_req.SetRecvTimeoutInms(req.GetRecvTimeoutInms()); - result = PutObjectCopy(put_copy_req, &put_copy_resp); + result = PutObjectCopy(put_copy_req, &put_copy_resp, change_backup_domain); if (result.IsSucc()) { resp->CopyFrom(put_copy_resp); } @@ -1025,7 +1065,7 @@ CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp) { init_req.SetRecvTimeoutInms(req.GetRecvTimeoutInms()); init_req.AddHeaders(req.GetInitHeader()); - result = InitMultiUpload(init_req, &init_resp); + result = InitMultiUpload(init_req, &init_resp, change_backup_domain); if (!result.IsSucc()) { SDK_LOG_ERR("InitMultiUpload in Copy fail, req=[%s], result=[%s]", init_req.DebugString().c_str(), result.DebugString().c_str()); @@ -1051,7 +1091,7 @@ CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp) { Poco::ThreadPool tp(pool_size); std::string path = "/" + req.GetObjectName(); std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string dest_url = GetRealUrl(host, path, req.IsHttps()); FileCopyTask** pptaskArr = new FileCopyTask*[pool_size]; for (unsigned i = 0; i < pool_size; ++i) { @@ -1107,7 +1147,7 @@ CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp) { req.GetObjectName(), upload_id); AbortMultiUploadResp abort_resp; - CosResult abort_result = AbortMultiUpload(abort_req, &abort_resp); + CosResult abort_result = AbortMultiUpload(abort_req, &abort_resp, change_backup_domain); if (!abort_result.IsSucc()) { SDK_LOG_ERR("Copy failed, and abort muliti upload also failed" ", upload_id=%s", @@ -1145,7 +1185,7 @@ CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp) { comp_req.SetEtags(etags); comp_req.SetPartNumbers(part_numbers); - result = CompleteMultiUpload(comp_req, &comp_resp); + result = CompleteMultiUpload(comp_req, &comp_resp, change_backup_domain); if (result.IsSucc()) { resp->CopyFrom(comp_resp); } @@ -1164,9 +1204,9 @@ CosResult ObjectOp::Copy(const CopyReq& req, CopyResp* resp) { } CosResult ObjectOp::PostObjectRestore(const PostObjectRestoreReq& req, - PostObjectRestoreResp* resp) { + PostObjectRestoreResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); CosResult result; @@ -1188,7 +1228,8 @@ CosResult ObjectOp::PostObjectRestore(const PostObjectRestoreReq& req, CosResult ObjectOp::MultiThreadDownload(const GetObjectByFileReq& req, GetObjectByFileResp* resp, - const SharedTransferHandler& handler) { + const SharedTransferHandler& handler, + bool change_backup_domain) { CosResult result; if (!handler && !resp) { SetResultAndLogError(result, "invalid input parameter"); @@ -1198,12 +1239,16 @@ ObjectOp::MultiThreadDownload(const GetObjectByFileReq& req, // 1. 调用HeadObject获取文件长度 HeadObjectReq head_req(req.GetBucketName(), req.GetObjectName()); HeadObjectResp head_resp; - head_result = HeadObject(head_req, &head_resp); + head_result = HeadObject(head_req, &head_resp, change_backup_domain); if (!head_result.IsSucc()) { SetResultAndLogError( head_result, "failed to get object length before downloading object."); if (handler) { - handler->UpdateStatus(TransferStatus::FAILED, head_result); + if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + handler->UpdateStatus(TransferStatus::RETRY, head_result); + }else{ + handler->UpdateStatus(TransferStatus::FAILED, head_result); + } } return head_result; } @@ -1212,7 +1257,7 @@ ObjectOp::MultiThreadDownload(const GetObjectByFileReq& req, std::map headers = req.GetHeaders(); std::map params = req.GetParams(); std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); if (!IsDomainSameToHost()) { @@ -1449,11 +1494,12 @@ CosResult ObjectOp::MultiThreadUpload( const std::vector& already_exist_parts, bool resume_flag, std::vector* etags_ptr, std::vector* part_numbers_ptr, - const SharedTransferHandler& handler) { + const SharedTransferHandler& handler, + bool change_backup_domain) { CosResult result; std::string path = "/" + req.GetObjectName(); std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); // 1. 获取文件大小 std::string local_file_path = req.GetLocalFilePath(); @@ -1787,17 +1833,17 @@ std::string ObjectOp::GeneratePresignedUrl(const GeneratePresignedUrlReq& req) { } CosResult ObjectOp::OptionsObject(const OptionsObjectReq& req, - OptionsObjectResp* resp) { + OptionsObjectResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, "", false, resp); } CosResult ObjectOp::SelectObjectContent(const SelectObjectContentReq& req, - SelectObjectContentResp* resp) { + SelectObjectContentResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); CosResult result; @@ -1818,14 +1864,21 @@ CosResult ObjectOp::SelectObjectContent(const SelectObjectContentReq& req, CosResult ObjectOp::AppendObject(const AppendObjectReq& req, AppendObjectResp* resp) { - return PutObject(static_cast(req), + CosResult result = PutObject(static_cast(req), static_cast(resp)); + if (UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + result = PutObject(static_cast(req), + static_cast(resp), + nullptr, + COS_CHANGE_BACKUP_DOMAIN); + } + return result; } CosResult ObjectOp::PutLiveChannel(const PutLiveChannelReq& req, - PutLiveChannelResp* resp) { + PutLiveChannelResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); CosResult result; @@ -1853,45 +1906,49 @@ CosResult ObjectOp::PutLiveChannel(const PutLiveChannelReq& req, } CosResult ObjectOp::PutLiveChannelSwitch(const PutLiveChannelSwitchReq& req, - PutLiveChannelSwitchResp* resp) { + PutLiveChannelSwitchResp* resp, bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, std::map(), std::map(), "", false, resp); } CosResult ObjectOp::GetLiveChannel(const GetLiveChannelReq& req, - GetLiveChannelResp* resp) { + GetLiveChannelResp* resp, + bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, std::map(), std::map(), "", false, resp); } CosResult ObjectOp::GetLiveChannelHistory(const GetLiveChannelHistoryReq& req, - GetLiveChannelHistoryResp* resp) { + GetLiveChannelHistoryResp* resp, + bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, std::map(), std::map(), "", false, resp); } CosResult ObjectOp::GetLiveChannelStatus(const GetLiveChannelStatusReq& req, - GetLiveChannelStatusResp* resp) { + GetLiveChannelStatusResp* resp, + bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, std::map(), std::map(), "", false, resp); } CosResult ObjectOp::DeleteLiveChannel(const DeleteLiveChannelReq& req, - DeleteLiveChannelResp* resp) { + DeleteLiveChannelResp* resp, + bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, std::map(), std::map(), "", false, resp); @@ -1899,9 +1956,10 @@ CosResult ObjectOp::DeleteLiveChannel(const DeleteLiveChannelReq& req, CosResult ObjectOp::GetLiveChannelVodPlaylist(const GetLiveChannelVodPlaylistReq& req, - GetLiveChannelVodPlaylistResp* resp) { + GetLiveChannelVodPlaylistResp* resp, + bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, std::map(), std::map(), "", false, resp); @@ -1909,9 +1967,10 @@ ObjectOp::GetLiveChannelVodPlaylist(const GetLiveChannelVodPlaylistReq& req, CosResult ObjectOp::PostLiveChannelVodPlaylist(const PostLiveChannelVodPlaylistReq& req, - PostLiveChannelVodPlaylistResp* resp) { + PostLiveChannelVodPlaylistResp* resp, + bool change_backup_domain) { std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(), change_backup_domain); std::string path = req.GetPath(); return NormalAction(host, path, req, std::map(), std::map(), "", false, resp); @@ -1919,7 +1978,8 @@ ObjectOp::PostLiveChannelVodPlaylist(const PostLiveChannelVodPlaylistReq& req, CosResult ObjectOp::ResumableGetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp, - const SharedTransferHandler& handler) { + const SharedTransferHandler& handler, + bool change_backup_domain) { CosResult result; if (!handler && !resp) { SetResultAndLogError(result, "invalid input parameter"); @@ -1929,12 +1989,16 @@ CosResult ObjectOp::ResumableGetObject(const GetObjectByFileReq& req, // 1. 调用HeadObject获取文件长度 HeadObjectReq head_req(req.GetBucketName(), req.GetObjectName()); HeadObjectResp head_resp; - head_result = HeadObject(head_req, &head_resp); + head_result = HeadObject(head_req, &head_resp, change_backup_domain); if (!head_result.IsSucc()) { SetResultAndLogError( head_result, "failed to get object length before downloading object."); if (handler) { - handler->UpdateStatus(TransferStatus::FAILED, head_result); + if(!change_backup_domain && UseDefaultDomain() && RetryUtil::ShouldRetryWithChangeDomain(result)){ + handler->UpdateStatus(TransferStatus::RETRY, head_result); + }else{ + handler->UpdateStatus(TransferStatus::FAILED, head_result); + } } return head_result; } @@ -1976,7 +2040,7 @@ CosResult ObjectOp::ResumableGetObject(const GetObjectByFileReq& req, std::map headers = req.GetHeaders(); std::map params = req.GetParams(); std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(),change_backup_domain); std::string path = req.GetPath(); if (!IsDomainSameToHost()) { @@ -2282,7 +2346,8 @@ CosResult ObjectOp::ResumableGetObject(const GetObjectByFileReq& req, } CosResult ObjectOp::PutObjects(const PutObjectsByDirectoryReq& req, - PutObjectsByDirectoryResp* resp) { + PutObjectsByDirectoryResp* resp, + bool change_backup_domain) { CosResult result; std::string directory_name = req.GetDirectoryName(); if (directory_name.empty() || !FileUtil::IsDirectoryExists(directory_name)) { @@ -2315,7 +2380,7 @@ CosResult ObjectOp::PutObjects(const PutObjectsByDirectoryReq& req, PutDirectoryResp put_dir_resp; put_dir_req.AddHeaders(req.GetHeaders()); SDK_LOG_DBG("start to mkdir: %s", file_name.c_str()); - CosResult put_dir_result = PutDirectory(put_dir_req, &put_dir_resp); + CosResult put_dir_result = PutDirectory(put_dir_req, &put_dir_resp, change_backup_domain); if (!put_dir_result.IsSucc()) { SDK_LOG_ERR("failed to mkdir: %s", file_name.c_str()); return put_dir_result; @@ -2329,7 +2394,7 @@ CosResult ObjectOp::PutObjects(const PutObjectsByDirectoryReq& req, PutObjectByFileResp put_obj_resp; SDK_LOG_DBG("start to upload %s to %s", file_name.c_str(), object_name.c_str()); - CosResult put_obj_result = PutObject(put_obj_req, &put_obj_resp); + CosResult put_obj_result = PutObject(put_obj_req, &put_obj_resp, nullptr, change_backup_domain); if (!put_obj_result.IsSucc()) { SDK_LOG_ERR("failed to upload file: %s to cos", file_name.c_str()); return put_obj_result; @@ -2345,10 +2410,11 @@ CosResult ObjectOp::PutObjects(const PutObjectsByDirectoryReq& req, } CosResult ObjectOp::PutDirectory(const PutDirectoryReq& req, - PutDirectoryResp* resp) { + PutDirectoryResp* resp, + bool change_backup_domain) { CosResult result; std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(),change_backup_domain); std::string path = req.GetPath(); std::istringstream is(""); // std::istream is(ss); @@ -2357,16 +2423,16 @@ CosResult ObjectOp::PutDirectory(const PutDirectoryReq& req, return result; } -CosResult ObjectOp::MoveObject(const MoveObjectReq& req) { +CosResult ObjectOp::MoveObject(const MoveObjectReq& req, bool change_backup_domain) { CosResult copy_result; CopyReq copy_req(req.GetBucketName(), req.GetDstObjectName()); std::string host = CosSysConfig::GetHost(GetAppId(), m_config->GetRegion(), - req.GetBucketName()); + req.GetBucketName(),change_backup_domain); copy_req.SetXCosCopySource(host + "/" + req.GetSrcObjectName()); CopyResp copy_resp; // copy to dst object - copy_result = Copy(copy_req, ©_resp); + copy_result = Copy(copy_req, ©_resp, change_backup_domain); if (!copy_result.IsSucc()) { SDK_LOG_ERR("failed to copy object from: %s to :%s", req.GetSrcObjectName().c_str(), req.GetDstObjectName().c_str()); @@ -2377,7 +2443,7 @@ CosResult ObjectOp::MoveObject(const MoveObjectReq& req) { CosResult del_result; DeleteObjectReq del_req(req.GetBucketName(), req.GetSrcObjectName()); DeleteObjectResp del_resp; - del_result = DeleteObject(del_req, &del_resp); + del_result = DeleteObject(del_req, &del_resp, change_backup_domain); if (!del_result.IsSucc()) { SDK_LOG_ERR("failed to delete src object: %s", req.GetSrcObjectName().c_str()); diff --git a/src/request/object_req.cpp b/src/request/object_req.cpp index 9ac6da2..7a1a8fe 100644 --- a/src/request/object_req.cpp +++ b/src/request/object_req.cpp @@ -205,9 +205,11 @@ bool SelectObjectContentReq::GenerateRequestBody(std::string* body) const { rapidxml::xml_node<>* root_node; rapidxml::xml_node<>* request_progress; + std::string inputserialization_copy = m_inputserialization.c_str(); + std::string outputserialization_copy = m_outputserialization.c_str(); // parse input serialization try { - input.parse<0>(const_cast(m_inputserialization.c_str())); + input.parse<0>(const_cast(inputserialization_copy.c_str())); } catch (rapidxml::parse_error e) { SDK_LOG_ERR("input_serialization parse error %s %s", e.what(), m_inputserialization.c_str()); @@ -216,7 +218,7 @@ bool SelectObjectContentReq::GenerateRequestBody(std::string* body) const { // parse input serialization try { - output.parse<0>(const_cast(m_outputserialization.c_str())); + output.parse<0>(const_cast(outputserialization_copy.c_str())); } catch (rapidxml::parse_error e) { SDK_LOG_ERR("out serialization parse error %s %s", e.what(), m_inputserialization.c_str()); diff --git a/src/util/retry_util.cpp b/src/util/retry_util.cpp new file mode 100644 index 0000000..70dcda5 --- /dev/null +++ b/src/util/retry_util.cpp @@ -0,0 +1,15 @@ +#include "util/retry_util.h" +#include "cos_sys_config.h" + +namespace qcloud_cos { + + +bool RetryUtil::ShouldRetryWithChangeDomain(CosResult result) { + if ((result.GetHttpStatus()/100 != 2 && result.GetXCosRequestId().empty()) && CosSysConfig::GetRetryChangeDomain()) + { + return true; + } + return false; +} + +} // namespace qcloud_cos \ No newline at end of file