aliyun-sdk
Version:
Aliyun SDK for JavaScript
75 lines (58 loc) • 2.02 kB
JavaScript
var ALY = require('../core');
require('./rest');
require('./json');
function randomNumbers(count) {
var num = '';
for (var i = 0; i < count; i++) {
num += Math.floor(Math.random() * 10);
}
return num;
}
/**
* @api private
*/
ALY.ServiceInterface.Pop = {
buildRequest: function buildRequest(req) {
ALY.ServiceInterface.Rest.buildRequest(req);
ALY.ServiceInterface.Pop.populateBody(req);
},
extractError: function extractError(resp) {
ALY.ServiceInterface.Json.extractError(resp);
},
extractData: function extractData(resp) {
resp.data = JSON.parse(resp.httpResponse.body.toString());
},
populateBody: function populateBody(req) {
req.httpRequest.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
var body = req.params;
var date = ALY.util.date.getDate();
body.Format = "JSON";
body.Version = req.service.api.apiVersion;
body.AccessKeyId = req.service.config.accessKeyId;
body.SignatureVersion = "1.0";
body.SignatureMethod = "HMAC-SHA1";
body.SignatureNonce = String(date.getTime()) + randomNumbers(4);
body.Timestamp = ALY.util.date.iso8601(date);
// sign
var headers = [];
ALY.util.each(body, function (name) {
headers.push(name);
});
headers.sort(function (a, b) {
return a < b ? -1 : 1;
});
var canonicalizedQueryString = "";
ALY.util.arrayEach.call(this, headers, function (name) {
canonicalizedQueryString += "&" + name + "=" + ALY.util.popEscape(body[name]);
});
var stringToSign = 'POST&%2F&' + ALY.util.popEscape(canonicalizedQueryString.substr(1));
body.Signature = ALY.util.crypto.hmac(req.service.config.secretAccessKey + '&', stringToSign, 'base64', 'sha1');
// body
var bodyString = ALY.util.queryParamsToString(body);
req.httpRequest.body = bodyString;
},
buildJSON: function buildJSON(params, rules, api) {
var builder = new ALY.JSON.Builder(rules, api);
return builder.build(params);
}
};