diff --git a/CHANGELOG.md b/CHANGELOG.md index 1054fe6..0099bb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ ## Release Note + +### 2025.6.23 Version 2.6.16 +- 支持 请求指定请求头域 + ### 2025.4.19 Version 2.6.15 - 支持 请求时携带客户端证书 - 修复 默认流控实现中返回时间单位错误问题 diff --git a/CMakeLists.txt b/CMakeLists.txt index 150729b..44f61ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.1) project(ve-tos-cpp-sdk - VERSION 2.6.15 + VERSION 2.6.16 LANGUAGES CXX) # project settings diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 136ba5b..4cf00c0 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.1) project(ve-tos-cpp-sdk-example - VERSION 2.6.15 + VERSION 2.6.16 LANGUAGES CXX) add_executable(${PROJECT_NAME} example.cc) diff --git a/sdk/CMakeLists.txt b/sdk/CMakeLists.txt index 7ebb7a4..88aaad9 100644 --- a/sdk/CMakeLists.txt +++ b/sdk/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.1) project(ve-tos-cpp-sdk-lib - VERSION 2.6.15 + VERSION 2.6.16 LANGUAGES CXX) set(SDK_HEADER include/auth/Credential.h diff --git a/sdk/include/RequestBuilder.h b/sdk/include/RequestBuilder.h index 4e02f65..5574a3e 100644 --- a/sdk/include/RequestBuilder.h +++ b/sdk/include/RequestBuilder.h @@ -115,6 +115,13 @@ class RequestBuilder { requestDate_ = requestDate; } + const std::map& getRequestHeader() const { + return requestHeader_; + } + void setRequestHeader(const std::map& requestHeader) { + requestHeader_ = requestHeader; + } + std::shared_ptr Build(const std::string& method); std::shared_ptr BuildControlRequest(const std::string& method); std::shared_ptr Build(const std::string& method, std::shared_ptr content); @@ -142,5 +149,6 @@ class RequestBuilder { bool isCustomDomain_ = false; std::time_t requestDate_ = 0; + std::map requestHeader_ = {}; }; } // namespace VolcengineTos diff --git a/sdk/include/TosClient.h b/sdk/include/TosClient.h index 5a93a9e..e3a2a5b 100644 --- a/sdk/include/TosClient.h +++ b/sdk/include/TosClient.h @@ -57,7 +57,7 @@ #include "model/object/ModifyObjectInput.h" #include "model/object/ModifyObjectOutput.h" namespace VolcengineTos { -static const char* TOS_SDK_VERSION = "v2.6.15"; +static const char* TOS_SDK_VERSION = "v2.6.16"; #ifdef WIN32 static const char* PLATFORM_NAME = "windows"; #elif __linux__ diff --git a/sdk/include/model/GenericInput.h b/sdk/include/model/GenericInput.h index 0512609..a653dee 100644 --- a/sdk/include/model/GenericInput.h +++ b/sdk/include/model/GenericInput.h @@ -1,5 +1,6 @@ #pragma once #include +#include namespace VolcengineTos { class GenericInput { @@ -16,7 +17,16 @@ class GenericInput { std::time_t getRequestDate() const { return requestDate_; } + + const std::map& getRequestHeader() const { + return requestHeader_; + } + void setRequestHeader(const std::map& requestHeader) { + requestHeader_ = requestHeader; + } + private: std::time_t requestDate_ = 0; + std::map requestHeader_ = {}; }; -} // namespace VolcengineTos +} // namespace VolcengineTos \ No newline at end of file diff --git a/sdk/src/RequestBuilder.cc b/sdk/src/RequestBuilder.cc index 7365979..6af921a 100644 --- a/sdk/src/RequestBuilder.cc +++ b/sdk/src/RequestBuilder.cc @@ -3,6 +3,37 @@ #include "auth/SignV4.h" using namespace VolcengineTos; +// 合并 GenericInput RequestHeader 和请求中的 header +void mergeRequestHeaderAndHeader(const std::map &reqHeader, std::map &header) { + if (reqHeader.empty()) + return; + + std::map lower_header; + for (const auto& pair : header) { + lower_header[StringUtils::toLower(pair.first)] = pair.second; + } + + auto iter = reqHeader.begin(); + for (; iter != reqHeader.end(); iter++) { + if (iter->first.empty()) { + continue; + } + + std::string key(iter->first); + std::string kk = StringUtils::toLower(key); + + if (kk == "content-length" || kk == "host" || kk == "x-tos-date" || + kk == "range" || kk == "transfer-encoding" || kk == "authorization" || + kk == "date") { + continue; + } + + if (lower_header.find(kk) == lower_header.end()) { + header.insert({iter->first, iter->second}); // 如果不存在,插入键值对 + } + } +} + std::shared_ptr RequestBuilder::build(const std::string& method) { std::string host, path; if (isCustomDomain_){ @@ -20,6 +51,7 @@ std::shared_ptr RequestBuilder::build(const std::string& method) { } } + mergeRequestHeaderAndHeader(requestHeader_, headers_); auto req = std::make_shared(scheme_, method, host, path, headers_, query_); req->setRequestDate(requestDate_); return req; @@ -27,6 +59,7 @@ std::shared_ptr RequestBuilder::build(const std::string& method) { std::shared_ptr RequestBuilder::buildControlRequest(const std::string& method) { std::string host = accountID_ + "." + controlHost_; + mergeRequestHeaderAndHeader(requestHeader_, headers_); auto req = std::make_shared(scheme_, method, host, "/qospolicy", headers_, query_); req->setRequestDate(requestDate_); return req; @@ -46,6 +79,7 @@ std::shared_ptr RequestBuilder::buildSignedURL(const std::string& me path += object_; } + mergeRequestHeaderAndHeader(requestHeader_, headers_); auto req = std::make_shared(scheme_, method, host, path, headers_, query_); req->setRequestDate(requestDate_); return req; diff --git a/sdk/src/TosClientImpl.cc b/sdk/src/TosClientImpl.cc index 0f0bff0..11d2233 100644 --- a/sdk/src/TosClientImpl.cc +++ b/sdk/src/TosClientImpl.cc @@ -7863,6 +7863,7 @@ RequestBuilder TosClientImpl::newBuilder(const std::string& accountID, const Gen config_.isCustomDomain()); rb.withHeader(http::HEADER_USER_AGENT, userAgent_); rb.setRequestDate(genericInput.getRequestDate()); + rb.setRequestHeader(genericInput.getRequestHeader()); return rb; } @@ -7873,6 +7874,7 @@ RequestBuilder TosClientImpl::newBuilder(const std::string& bucket, const std::s urlMode_, headers, queries,config_.isCustomDomain()); rb.withHeader(http::HEADER_USER_AGENT, userAgent_); rb.setRequestDate(genericInput.getRequestDate()); + rb.setRequestHeader(genericInput.getRequestHeader()); return rb; } @@ -7889,6 +7891,7 @@ RequestBuilder TosClientImpl::newBuilder(const std::string& bucket, const std::s queries, config_.isCustomDomain()); rb.withHeader(http::HEADER_USER_AGENT, userAgent_); rb.setRequestDate(genericInput.getRequestDate()); + rb.setRequestHeader(genericInput.getRequestHeader()); return rb; } RequestBuilder TosClientImpl::newBuilder(const std::string& bucket, const std::string& object, @@ -7910,6 +7913,7 @@ RequestBuilder TosClientImpl::newBuilder(const std::string& bucket, const std::s rb.setAutoRecognizeContentType(builder.isAutoRecognizeContentType()); rb.setRange(builder.getRange()); rb.setRequestDate(genericInput.getRequestDate()); + rb.setRequestHeader(genericInput.getRequestHeader()); return rb; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f4cce6c..fa3d2f6 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.1) project(ve-tos-cpp-sdk-test - VERSION 2.6.15 + VERSION 2.6.16 LANGUAGES CXX) include(FetchContent) diff --git a/test/src/Object/ObjectPutGetTest.cc b/test/src/Object/ObjectPutGetTest.cc index aba10c6..54e4c5a 100644 --- a/test/src/Object/ObjectPutGetTest.cc +++ b/test/src/Object/ObjectPutGetTest.cc @@ -20,7 +20,7 @@ class ObjectPutGetTest : public ::testing::Test { conf.maxRetryCount = 0; conf.userAgentProductName = "tos"; conf.userAgentSoftName="cxxSdk"; - conf.userAgentSoftVersion = "2.6.15"; + conf.userAgentSoftVersion = "2.6.16"; conf.userAgentCustomizedKeyValues = {{"key1", "value1"}, {"key2", "value2"}}; cliV2 = std::make_shared(TestConfig::Region, TestConfig::Ak, TestConfig::Sk, conf); bkt_name = TestUtils::GetBucketName(TestConfig::TestPrefix); diff --git a/test/src/Object/ObjectRenameTest.cc b/test/src/Object/ObjectRenameTest.cc index 475fe7b..0d04019 100644 --- a/test/src/Object/ObjectRenameTest.cc +++ b/test/src/Object/ObjectRenameTest.cc @@ -20,7 +20,7 @@ class ObjectRenameTest : public ::testing::Test { conf.maxRetryCount = 0; conf.userAgentProductName = "tos"; conf.userAgentSoftName="cxxSdk"; - conf.userAgentSoftVersion = "2.6.15"; + conf.userAgentSoftVersion = "2.6.16"; conf.userAgentCustomizedKeyValues = {{"key1", "value1"}, {"key2", "value2"}}; cliV2 = std::make_shared(TestConfig::Region, TestConfig::Ak, TestConfig::Sk, conf); bkt_name = TestUtils::GetBucketName(TestConfig::TestPrefix);