Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 28 additions & 3 deletions include/cos_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
#include "util/log_util.h"

namespace qcloud_cos {

#define COS_DEFAULT_MAX_RETRY_TIMES 3

#define COS_DEFAULT_RETRY_INTERVAL_MS 100

class CosConfig {
public:
/// \brief CosConfig构造函数
Expand All @@ -31,7 +36,9 @@ class CosConfig {
m_dest_domain(""),
m_is_domain_same_to_host(false),
m_is_domain_same_to_host_enable(false),
m_config_parsed(false) {}
m_config_parsed(false),
m_max_retry_times(COS_DEFAULT_MAX_RETRY_TIMES),
m_retry_interval_ms(COS_DEFAULT_RETRY_INTERVAL_MS) {}

/// \brief CosConfig构造函数
///
Expand All @@ -52,7 +59,9 @@ class CosConfig {
m_dest_domain(""),
m_is_domain_same_to_host(false),
m_is_domain_same_to_host_enable(false),
m_config_parsed(false) {}
m_config_parsed(false),
m_max_retry_times(COS_DEFAULT_MAX_RETRY_TIMES),
m_retry_interval_ms(COS_DEFAULT_RETRY_INTERVAL_MS) {}

/// \brief CosConfig构造函数
///
Expand All @@ -74,7 +83,9 @@ class CosConfig {
m_dest_domain(""),
m_is_domain_same_to_host(false),
m_is_domain_same_to_host_enable(false),
m_config_parsed(false) {}
m_config_parsed(false),
m_max_retry_times(COS_DEFAULT_MAX_RETRY_TIMES),
m_retry_interval_ms(COS_DEFAULT_RETRY_INTERVAL_MS) {}

/// \brief CosConfig复制构造函数
///
Expand All @@ -92,6 +103,8 @@ class CosConfig {
m_is_domain_same_to_host = config.m_is_domain_same_to_host;
m_is_domain_same_to_host_enable = config.m_is_domain_same_to_host;
m_config_parsed = config.m_config_parsed;
m_max_retry_times = config.m_max_retry_times;
m_retry_interval_ms = config.m_retry_interval_ms;
}

/// \brief CosConfig赋值构造函数
Expand All @@ -110,6 +123,8 @@ class CosConfig {
m_is_domain_same_to_host = config.m_is_domain_same_to_host;
m_is_domain_same_to_host_enable = config.m_is_domain_same_to_host;
m_config_parsed = config.m_config_parsed;
m_max_retry_times = config.m_max_retry_times;
m_retry_interval_ms = config.m_retry_interval_ms;
return *this;
}

Expand Down Expand Up @@ -198,6 +213,14 @@ class CosConfig {
/// \brief 设置日志回调
void SetLogCallback(const LogCallback log_callback);

uint64_t GetMaxRetryTimes() const;

void SetMaxRetryTimes(uint64_t max_retry_times);

uint64_t GetRetryIntervalMs() const;

void SetRetryIntervalMs(uint64_t retry_interval_ms);

static bool JsonObjectGetStringValue(
const Poco::JSON::Object::Ptr& json_object, const std::string& key,
std::string* value);
Expand All @@ -222,6 +245,8 @@ class CosConfig {
bool m_is_domain_same_to_host;
bool m_is_domain_same_to_host_enable;
bool m_config_parsed;
uint64_t m_max_retry_times;
uint64_t m_retry_interval_ms;
};

typedef std::shared_ptr<CosConfig> SharedConfig;
Expand Down
1 change: 1 addition & 0 deletions include/cos_params.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ const char kReqHeaderDate[] = "Date";
const char kReqHeaderServer[] = "Server";
const char kReqHeaderXCosReqId[] = "x-cos-request-id";
const char kReqHeaderXCosTraceId[] = "x-cos-trace-id";
const char kReqHeaderXCosSdkRetry[] = "x-cos-sdk-retry";

// Response Header
const char kRespHeaderLastModified[] = "Last-Modified";
Expand Down
30 changes: 24 additions & 6 deletions include/op/base_op.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#ifndef COS_CPP_SDK_V5_INCLUDE_OP_BASE_OP_H_
#define COS_CPP_SDK_V5_INCLUDE_OP_BASE_OP_H_

#include <inttypes.h>
#include <stdint.h>

#include <map>
Expand All @@ -11,6 +10,7 @@
#include "cos_config.h"
#include "op/cos_result.h"
#include "trsf/transfer_handler.h"
#include "util/base_op_util.h"

namespace qcloud_cos {

Expand All @@ -22,7 +22,7 @@ class BaseOp {
/// \brief BaseOp构造函数
///
/// \param cos_conf Cos配置
explicit BaseOp(const SharedConfig& cos_conf) : m_config(cos_conf) {}
explicit BaseOp(const SharedConfig& cos_conf) : m_config(cos_conf), m_op_util(m_config) {}

BaseOp() {}

Expand Down Expand Up @@ -51,12 +51,8 @@ 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 相关接口的通用操作,
/// 包括签名计算、请求发送、返回内容解析等
///
Expand Down Expand Up @@ -128,6 +124,28 @@ class BaseOp {
protected:
bool CheckConfigValidation() const;
SharedConfig m_config;
BaseOpUtil m_op_util;

private:
CosResult NormalRequest(
const std::string& host, const std::string& path, const BaseReq& req,
const std::map<std::string, std::string>& additional_headers,
const std::map<std::string, std::string>& additional_params,
const std::string& req_body, bool check_body, BaseResp* resp,
const uint32_t &request_retry_num, bool is_ci_req = false);

CosResult DownloadRequest(const std::string& host, const std::string& path,
const BaseReq& req, BaseResp* resp, std::ostream& os,
const uint32_t &request_retry_num,
const SharedTransferHandler& handler = nullptr);

CosResult UploadRequest(
const std::string& host, const std::string& path, const BaseReq& req,
const std::map<std::string, std::string>& additional_headers,
const std::map<std::string, std::string>& additional_params,
std::istream& is, BaseResp* resp, const uint32_t &request_retry_num, const SharedTransferHandler& handler = nullptr);

bool NoNeedRetry(const CosResult &result);
};

} // namespace qcloud_cos
Expand Down
16 changes: 13 additions & 3 deletions include/op/file_copy_task.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,19 @@
#include <map>
#include <string>

#include "Poco/Foundation.h"
#include "Poco/Runnable.h"
#include "cos_defines.h"
#include "util/base_op_util.h"

namespace qcloud_cos {

class FileCopyTask : public Poco::Runnable {
public:
FileCopyTask(const std::string& full_url, uint64_t conn_timeout_in_ms,
FileCopyTask(const std::string& host,
const std::string& path,
const bool is_https,
const BaseOpUtil& op_util,
uint64_t conn_timeout_in_ms,
uint64_t recv_timeout_in_ms);

~FileCopyTask() {}
Expand Down Expand Up @@ -45,7 +49,9 @@ class FileCopyTask : public Poco::Runnable {
std::string GetLastModified() const { return m_last_modified; }

private:
std::string m_full_url;
std::string m_host;
std::string m_path;
bool m_is_https;
std::map<std::string, std::string> m_headers;
std::map<std::string, std::string> m_params;
uint64_t m_conn_timeout_in_ms;
Expand All @@ -62,6 +68,10 @@ class FileCopyTask : public Poco::Runnable {
std::string m_ca_location;
SSLCtxCallback m_ssl_ctx_cb;
void *m_user_data;

BaseOpUtil m_op_util;

void SendRequestOnce(std::string domain);
};

} // namespace qcloud_cos
14 changes: 11 additions & 3 deletions include/op/file_download_task.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,19 @@
#include <map>
#include <string>

#include "Poco/Foundation.h"
#include "Poco/Runnable.h"
#include "cos_config.h"
#include "trsf/transfer_handler.h"
#include "util/base_op_util.h"

namespace qcloud_cos {

class FileDownTask : public Poco::Runnable {
public:
FileDownTask(const std::string& full_url,
FileDownTask(const std::string& host,
const std::string& path,
const bool is_https,
const BaseOpUtil& op_util,
const std::map<std::string, std::string>& headers,
const std::map<std::string, std::string>& params,
uint64_t conn_timeout_in_ms, uint64_t recv_timeout_in_ms,
Expand Down Expand Up @@ -57,7 +60,10 @@ class FileDownTask : public Poco::Runnable {
std::string GetErrMsg() const { return m_err_msg; }

private:
std::string m_full_url;
std::string m_host;
std::string m_path;
bool m_is_https;
BaseOpUtil m_op_util;
std::map<std::string, std::string> m_headers;
std::map<std::string, std::string> m_params;
uint64_t m_conn_timeout_in_ms;
Expand All @@ -79,6 +85,8 @@ class FileDownTask : public Poco::Runnable {
void *m_user_data;

SharedConfig m_config;

void SendRequestOnce(std::string domain);
};

} // namespace qcloud_cos
26 changes: 21 additions & 5 deletions include/op/file_upload_task.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,31 @@
#include <map>
#include <string>

#include "Poco/Foundation.h"
#include "Poco/Runnable.h"
#include "request/object_req.h"
#include "trsf/transfer_handler.h"
#include "util/base_op_util.h"

namespace qcloud_cos {

class FileUploadTask : public Poco::Runnable {
public:
FileUploadTask(const std::string& full_url, uint64_t conn_timeout_in_ms,
FileUploadTask(const std::string& host,
const std::string& path,
const bool is_https,
const BaseOpUtil& op_util,
uint64_t conn_timeout_in_ms,
uint64_t recv_timeout_in_ms, unsigned char* pbuf = NULL,
const size_t data_len = 0,
bool verify_cert = true,
const std::string& ca_location = "",
SSLCtxCallback ssl_ctx_cb = nullptr,
void *user_data = nullptr);

FileUploadTask(const std::string& full_url,
FileUploadTask(const std::string& host,
const std::string& path,
const bool is_https,
const BaseOpUtil& op_util,
const std::map<std::string, std::string>& headers,
const std::map<std::string, std::string>& params,
uint64_t conn_timeout_in_ms, uint64_t recv_timeout_in_ms,
Expand All @@ -30,7 +37,10 @@ class FileUploadTask : public Poco::Runnable {
SSLCtxCallback ssl_ctx_cb = nullptr,
void *user_data = nullptr);

FileUploadTask(const std::string& full_url,
FileUploadTask(const std::string& host,
const std::string& path,
const bool is_https,
const BaseOpUtil& op_util,
const std::map<std::string, std::string>& headers,
const std::map<std::string, std::string>& params,
uint64_t conn_timeout_in_ms, uint64_t recv_timeout_in_ms,
Expand Down Expand Up @@ -91,7 +101,9 @@ class FileUploadTask : public Poco::Runnable {
}

private:
std::string m_full_url;
std::string m_host;
std::string m_path;
bool m_is_https;
std::map<std::string, std::string> m_headers;
std::map<std::string, std::string> m_params;
uint64_t m_conn_timeout_in_ms;
Expand All @@ -115,6 +127,10 @@ class FileUploadTask : public Poco::Runnable {

bool mb_check_crc64;
uint64_t m_crc64_value;

BaseOpUtil m_op_util;

void SendRequestOnce(std::string domain, std::string md5_str);
};

} // namespace qcloud_cos
32 changes: 32 additions & 0 deletions include/util/base_op_util.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#ifndef COS_CPP_SDK_V5_INCLUDE_UTIL_BASE_OP_UTIL_H_
#define COS_CPP_SDK_V5_INCLUDE_UTIL_BASE_OP_UTIL_H_

#include <utility>

#include "cos_config.h"
#include "op/cos_result.h"

namespace qcloud_cos {
class BaseOpUtil {
public:
explicit BaseOpUtil(SharedConfig cos_conf) : m_config(std::move(cos_conf)) {}

BaseOpUtil() = default;

bool ShouldChangeBackupDomain(const CosResult &result, const uint32_t &request_num, bool is_ci_req = false) const;

void SleepBeforeRetry(const uint32_t &request_num) const;

std::string GetRealUrl(const std::string& host, const std::string& path, bool is_https, bool is_generate_presigned_url = false) const;

uint64_t GetMaxRetryTimes() const;

static std::string ChangeHostSuffix(const std::string& host);

private:
SharedConfig m_config;

bool UseDefaultDomain() const;
};
} // namespace qcloud_cos
#endif // COS_CPP_SDK_V5_INCLUDE_UTIL_BASE_OP_UTIL_H_
25 changes: 6 additions & 19 deletions include/util/http_sender.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,6 @@ class HttpSender {
SSLCtxCallback ssl_ctx_cb = nullptr,
void *user_data = nullptr);

static int SendRequest(const SharedTransferHandler& handler,
const std::string& http_method,
const std::string& url_str,
const std::map<std::string, std::string>& req_params,
const std::map<std::string, std::string>& req_headers,
const std::string& req_body,
uint64_t conn_timeout_in_ms,
uint64_t recv_timeout_in_ms,
std::map<std::string, std::string>* resp_headers,
std::ostream& resp_stream, std::string* err_msg,
bool is_check_md5 = false,
bool is_verify_cert = true,
const std::string& ca_location = "",
SSLCtxCallback ssl_ctx_cb = nullptr,
void *user_data = nullptr);

static int SendRequest(const SharedTransferHandler& handler,
const std::string& http_method,
const std::string& url_str,
Expand All @@ -72,16 +56,19 @@ class HttpSender {
const std::string& url_str,
const std::map<std::string, std::string>& req_params,
const std::map<std::string, std::string>& req_headers,
std::istream& is, uint64_t conn_timeout_in_ms,
std::istream& is,
uint64_t conn_timeout_in_ms,
uint64_t recv_timeout_in_ms,
std::map<std::string, std::string>* resp_headers,
std::ostream& resp_stream, std::string* err_msg,
std::ostream& resp_stream,
std::string* err_msg,
bool is_check_md5 = false,
bool is_verify_cert = true,
const std::string& ca_location = "",
SSLCtxCallback ssl_ctx_cb = nullptr,
void *user_data = nullptr,
const char *req_body_buf = nullptr, size_t req_body_len = 0);
const char *req_body_buf = nullptr,
size_t req_body_len = 0);

static int SendRequest(const SharedTransferHandler& handler,
const std::string& http_method,
Expand Down
Loading