HttpRequest CommonClient::buildFileTransHttpRequest()

in nlsCppSdk/token/src/CommonClient.cpp [442:552]


HttpRequest CommonClient::buildFileTransHttpRequest(
    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();
  if (!credentials.stsToken().empty()) {
    queryParams["SecurityToken"] = credentials.stsToken();
  }
  queryParams["Action"] = msg.action();
  queryParams["Format"] = "JSON";
  queryParams["RegionId"] = configuration().regionId();
  queryParams["SignatureMethod"] = "HMAC-SHA1";
  queryParams["SignatureNonce"] = GenerateUuid();
  queryParams["SignatureVersion"] = "1.0";

  if (method == HttpRequest::Post) {
    queryParams["Task"] = msg.task();
    //        std::cout<< "Task: " << msg.task() << std::endl << std::endl;
  } else {
    queryParams["TaskId"] = msg.taskId();
    //        std::cout<< "TaskId: " << msg.taskId() << std::endl << std::endl;
  }

  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(url.path())
                << "&" << 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()) {
    std::string body = "Task=" + UrlEncode(msg.task());
    request.setBody(body.c_str(), body.size());
    std::stringstream sLength;
    sLength << body.size();
    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;
}