string Alibabacloud_OSSUtil::Client::getSignature()

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