void S3fsCurl::insertOSSV4Headers()

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());
    }
}