in util/cpp/src/ossutil.cpp [759:815]
string Alibabacloud_OSSUtil::Client::getSignature(const shared_ptr<Darabonba::Request>& request,
const shared_ptr<string>& bucketName,
const shared_ptr<string>& accessKeyId,
const shared_ptr<string>& accessKeySecret,
const shared_ptr<string>& signatureVersion,
const shared_ptr<vector<string>>& addtionalHeaders) {
string signature;
if (!request) {
return signature;
}
string signature_version = !signatureVersion ? "v1" : *signatureVersion;
Darabonba::Request req = !request ? Darabonba::Request() : *request;
string ak_id = !accessKeyId ? "" : *accessKeyId;
string ak_secret = !accessKeySecret? "" : *accessKeySecret;
if (signature_version == "v1") {
string resource;
if (bucketName) {
resource = "/" + *bucketName;
}
resource += request->pathname;
if (!request->query.empty() && !regex_search(resource, regex("\\?"))) {
resource += "?";
}
vector<string> sorted_query_keys;
for (const auto& i : request->query) {
sorted_query_keys.push_back(i.first);
}
sort(sorted_query_keys.begin(), sorted_query_keys.end());
for (const auto& key : sorted_query_keys) {
string value = request->query.at(key);
if (find(SIGN_KEY_LIST.begin(), SIGN_KEY_LIST.end(), key) != SIGN_KEY_LIST.end() && !value.empty()) {
if (boost::ends_with(resource, "?")) {
resource.append(key).append("=").append(value);
} else {
resource.append("&").append(key).append("=").append(value);
}
}
}
signature = "OSS " + *accessKeyId + ":" + signature_v1(*request, resource, *accessKeySecret);
} else {
if (addtionalHeaders && !addtionalHeaders->empty()) {
string signature2 = signature_v2(*request, *bucketName, *accessKeySecret, *addtionalHeaders);
signature = "OSS2 AccessKeyId:" + *accessKeyId + ",AdditionalHeaders:" + boost::join(*addtionalHeaders, ";") + ",Signature:" + signature2;
} else {
vector<string> headers;
string signature2 = signature_v2(*request, *bucketName, *accessKeySecret, headers);
signature = "OSS2 AccessKeyId:" + *accessKeyId + ",Signature:" + signature2;
}
}
return signature;
}