HttpRequest CommonClient::buildTokenHttpRequest()

in nlsCppSdk/token/src/CommonClient.cpp [139:314]


HttpRequest CommonClient::buildTokenHttpRequest(
    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());

  CommonRequest::ParameterCollection params = msg.headerParameters();
  std::map<std::string, std::string> queryParams;

  CommonRequest::ParameterCollectionIterator p;
  for (p = params.begin(); p != params.end(); ++p) {
    if (!p->second.empty()) {
      queryParams[p->first] = p->second;
    }
  }

  if (!queryParams.empty()) {
    std::stringstream queryString;
    std::map<std::string, std::string>::iterator p1;
    for (p1 = queryParams.begin(); p1 != queryParams.end(); ++p1) {
      if (p1->second.empty())
        queryString << "&" << p1->first;
      else
        queryString << "&" << p1->first << "=" << p1->second;
    }

    url.setQuery(queryString.str().substr(1));
  }

  HttpRequest request(url);

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

  std::stringstream ss;
  ss << msg.contentSize();
  request.setHeader("Content-Length", ss.str());
  request.setHeader(
      "Content-Type",
      "application/octet-stream;charset=utf-8");  //"application/octet-stream");
  request.setHeader("Content-MD5",
                    ComputeContentMD5(msg.content(), msg.contentSize()));

  std::time_t t = std::time(NULL);
  std::string date;
  char tmbuff[32] = {0};
  char tmWday[5] = {0};
  char tmMday[5] = {0};
  int day, week;
  struct tm gmt;

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

  day = gmt.tm_mon;
  week = gmt.tm_wday;

  switch (week) {
    case 0:
      strcpy(tmWday, "Sun");
      break;
    case 1:
      strcpy(tmWday, "Mon");
      break;
    case 2:
      strcpy(tmWday, "Tue");
      break;
    case 3:
      strcpy(tmWday, "Wed");
      break;
    case 4:
      strcpy(tmWday, "Thu");
      break;
    case 5:
      strcpy(tmWday, "Fri");
      break;
    case 6:
      strcpy(tmWday, "Sat");
      break;
    default:
      break;
  }

  switch (day) {
    case 0:
      strcpy(tmMday, "Jan");
      break;
    case 1:
      strcpy(tmMday, "Feb");
      break;
    case 2:
      strcpy(tmMday, "Mar");
      break;
    case 3:
      strcpy(tmMday, "Apr");
      break;
    case 4:
      strcpy(tmMday, "May");
      break;
    case 5:
      strcpy(tmMday, "Jun");
      break;
    case 6:
      strcpy(tmMday, "Jul");
      break;
    case 7:
      strcpy(tmMday, "Aug");
      break;
    case 8:
      strcpy(tmMday, "Sep");
      break;
    case 9:
      strcpy(tmMday, "Oct");
      break;
    case 10:
      strcpy(tmMday, "Nov");
      break;
    case 11:
      strcpy(tmMday, "Dec");
      break;
    default:
      break;
  }

  sprintf(tmbuff, WindowsSize "%s, %02d %s %d %02d:%02d:%02d", tmWday,
          gmt.tm_mday, tmMday, 1900 + gmt.tm_year, gmt.tm_hour, gmt.tm_min,
          gmt.tm_sec);

  // std::cout<< "Tmp tmbuff:" << tmbuff << std::endl;

  date = tmbuff;
  date += " GMT";
  request.setHeader("Date", date);
  request.setHeader("Host", url.host());
  request.setHeader("x-sdk-client", std::string("CPP/").append("1.3.2"));
  // request.setHeader("x-acs-region-id", configuration().regionId());
  if (!credentials.sessionToken().empty())
    request.setHeader("x-acs-security-token", credentials.sessionToken());

  request.setHeader("x-acs-signature-method", signer_->name());
  // request.setHeader("x-acs-signature-nonce", GenerateUuid());
  request.setHeader("x-acs-signature-version", signer_->version());
  request.setHeader("x-acs-version", msg.version());

  request.setHeader("x-sdk-invoke-type", "common");
  request.setHeader("Cache-Control", "no-cache");
  request.setHeader("Pragma", "no-cache");
  request.setHeader("Connection", "keep-alive");

  std::stringstream plaintext;
  plaintext << HttpMethodToString(method) << "\n"
            << request.header("Accept") << "\n"
            << request.header("Content-MD5") << "\n"
            << request.header("Content-Type") << "\n"
            << request.header("Date") << "\n"
            << canonicalizedHeaders(request.headers());
  if (!url.hasQuery()) {
    plaintext << url.path();
  } else {
    plaintext << url.path() << "?" << url.query();
  }

  std::stringstream sign;
  sign << "acs " << credentials.accessKeyId() << ":"
       << signer_->generate(plaintext.str(), credentials.accessKeySecret());
  request.setHeader("Authorization", sign.str());

  return request;
}