in sdk/src/utils/SignUtils.cc [57:112]
void SignUtils::build(const std::string &method,
const std::string &resource,
const std::string &date,
const HeaderCollection &headers,
const ParameterCollection ¶meters)
{
std::stringstream ss;
/*Version 1*/
// VERB + "\n" +
// Content-MD5 + "\n" +
// Content-Type + "\n"
// Date + "\n" +
// CanonicalizedOSSHeaders +
// CanonicalizedResource) +
//common headers
ss << method << "\n";
if (headers.find(Http::CONTENT_MD5) != headers.end()) {
ss << headers.at(Http::CONTENT_MD5);
}
ss << "\n";
if (headers.find(Http::CONTENT_TYPE) != headers.end()) {
ss << headers.at(Http::CONTENT_TYPE);
}
ss << "\n";
//Date or EXPIRES
ss << date << "\n";
//CanonicalizedOSSHeaders, start with x-oss-
for (const auto &header : headers) {
std::string lower = Trim(ToLower(header.first.c_str()).c_str());
if (lower.compare(0, 6, "x-oss-", 6) == 0) {
std::string value = Trim(header.second.c_str());
ss << lower << ":" << value << "\n";
}
}
//CanonicalizedResource, the sub resouce in
ss << resource;
char separator = '?';
for (auto const& param : parameters) {
if (ParamtersToSign.find(param.first) == ParamtersToSign.end()) {
continue;
}
ss << separator;
ss << param.first;
if (!param.second.empty()) {
ss << "=" << param.second;
}
separator = '&';
}
canonicalString_ = ss.str();
}