HttpRequest CommonClient::buildTokenHttpRpcRequest()

in nlsCppSdk/token/src/CommonClient.cpp [316:416]


HttpRequest CommonClient::buildTokenHttpRpcRequest(
    const std::string &endpoint, const CommonRequest &msg,
    HttpRequest::Method method) const {
  const Credentials credentials = credentialsProvider_->getCredentials();

  Url url;
  url.setScheme("http");
  url.setHost(endpoint);
  url.setPath(msg.resourcePath());

  std::map<std::string, std::string> queryParams;

  queryParams["AccessKeyId"] = credentials.accessKeyId();
  queryParams["Action"] = msg.action();
  queryParams["Format"] = "JSON";
  queryParams["RegionId"] = configuration().regionId();
  queryParams["SignatureMethod"] = "HMAC-SHA1";
  queryParams["SignatureNonce"] = GenerateUuid();
  queryParams["SignatureVersion"] = "1.0";

  std::time_t t = std::time(NULL);
  std::string date;
  struct tm gmt;
  char tmbuff[32] = {0};

#if defined(__linux__)
  gmtime_r(&t, &gmt);
#else
  gmtime_s(&gmt, &t);
#endif

  sprintf(tmbuff, WindowsSize "%d-%02d-%02dT%02d:%02d:%02dZ",
          1900 + gmt.tm_year, 1 + gmt.tm_mon, gmt.tm_mday, gmt.tm_hour,
          gmt.tm_min, gmt.tm_sec);

  date = tmbuff;

  //    std::cout<< "Timestamp: " << date << std::endl << std::endl;

  queryParams["Timestamp"] = date;

  queryParams["Version"] = msg.version();

  //    std::cout<< "Method: " << HttpMethodToString(method) << std::endl <<
  //    std::endl;

  std::stringstream filePlaintext;
  filePlaintext << HttpMethodToString(method) << "&" << UrlEncode("/") << "&"
                << UrlEncode(canonicalizedQuery(queryParams));

  //    std::cout<< "Signature String: " << filePlaintext.str() << std::endl <<
  //    std::endl;

  std::string tmp = signer_->generate(filePlaintext.str(),
                                      credentials.accessKeySecret() + "&");
  queryParams["Signature"] = tmp;

  //    std::cout<< "Signature Result: " << tmp << std::endl << std::endl;

  std::stringstream queryString;
  std::map<std::string, std::string>::iterator p1;
  for (p1 = queryParams.begin(); p1 != queryParams.end(); ++p1) {
    std::string key = p1->first;
    if (strncmp(key.c_str(), "Task", key.size()) != 0) {
      queryString << "&" << p1->first << "=" << UrlEncode(p1->second);
    }
  }
  url.setQuery(queryString.str().substr(1));

  //    std::cout<< "URL: " << url.toString() << std::endl << std::endl;

  HttpRequest request(url);
  request.setMethod(method);
  request.setHeader("Accept", "application/json");

  if (msg.hasContent()) {
    request.setBody(msg.content(), msg.contentSize());

    std::stringstream sLength;
    sLength << msg.contentSize();
    request.setHeader("Content-Length", sLength.str());
    request.setHeader("Content-Type",
                      "application/x-www-form-urlencoded;charset=utf-8");
    request.setHeader("Content-MD5",
                      ComputeContentMD5(msg.content(), msg.contentSize()));
  }

  //    std::cout<< "Host: " << url.host() << std::endl;

  request.setHeader("Host", url.host());
  request.setHeader("Accept-Encoding", "identity");
  request.setHeader("x-sdk-client", std::string("CPP/").append("1.3.2"));
  request.setHeader("x-sdk-invoke-type", "common");
  request.setHeader("Cache-Control", "no-cache");
  request.setHeader("Pragma", "no-cache");
  request.setHeader("Connection", "keep-alive");

  //    std::cout<< "End. " << std::endl;

  return request;
}