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