in src/curl.cpp [4384:4465]
void S3fsCurl::insertOSSV4Headers(const std::string& access_key_id, const std::string& secret_access_key, const std::string& access_token)
{
std::string canonical_url;
std::string canonical_query_string;
std::string scope;
std::string signature;
std::string server_path = type == REQTYPE_LISTBUCKET ? "/" : path;
get_canonical_resource_oss(server_path.c_str(), canonical_url);
canonical_url = urlEncode(canonical_url);
if (!query_string.empty()) {
std::map<std::string, std::vector<std::string>> query_map;
std::stringstream query_stream(query_string);
std::string token;
while (std::getline(query_stream, token, '&')) {
size_t pos = token.find("=");
std::string key = urlDecode(token.substr(0, pos));
std::string value = urlDecode((pos == std::string::npos) ? "" : token.substr(pos + 1));
query_map[urlEncodeOssv4Query(key)].push_back(urlEncodeOssv4Query(value));
}
std::stringstream result;
for (auto it = query_map.begin(); it != query_map.end(); ++ it) {
for (size_t i = 0; i < it->second.size(); ++ i) {
if (i > 0) {
result << "&";
}
result << it->first;
if (!it->second[i].empty()) {
result << "=" << it->second[i];
}
}
if (std::next(it) != query_map.end()) {
result << "&";
}
}
canonical_query_string = result.str();
}
std::string hash_payload = "UNSIGNED-PAYLOAD";
requestHeaders = curl_slist_sort_insert(requestHeaders, "x-oss-content-sha256", hash_payload.c_str());
requestHeaders = curl_slist_sort_insert(requestHeaders, "x-oss-date", get_date_iso8601(time(NULL)).c_str());
if(!access_token.empty()){
requestHeaders = curl_slist_sort_insert(requestHeaders, "x-oss-security-token", access_token.c_str());
}
if(op != "PUT" && op != "POST"){
requestHeaders = curl_slist_sort_insert(requestHeaders, "Content-Type", NULL);
}
if (S3fsCurl::IsRequesterPays()) {
requestHeaders = curl_slist_sort_insert(requestHeaders, "x-oss-request-payer", "requester");
S3FS_PRN_INFO3("Now Requester Pays buckets");
}
std::string signingDate = get_date_string(time(NULL));
std::string signingRegion = region;
std::string signingProduct;
std::string signingRequest = "aliyun_v4_request";
if (cloudbox_id.empty()) {
signingProduct = "oss";
} else {
signingProduct = "oss-cloudbox";
signingRegion = cloudbox_id;
}
scope = signingDate + "/" + signingRegion + "/" + signingProduct + "/" + signingRequest;
// The additional headers are empty in ossfs
signature = CalcSignatureOSSV4(op, canonical_url, canonical_query_string, get_canonical_headers_ossv4(requestHeaders), "", hash_payload, secret_access_key);
if(!S3fsCurl::IsPublicBucket()){
std::string authorization = std::string("OSS4-HMAC-SHA256 ") + \
"Credential=" + access_key_id + "/" + scope + ", " + \
"Signature=" + signature;
requestHeaders = curl_slist_sort_insert(requestHeaders, "Authorization", authorization.c_str());
}
}