aliyun-sdk
Version:
Aliyun SDK for JavaScript
132 lines (111 loc) • 4.2 kB
JavaScript
var ALY = require('../core');
/**
* @api private
*/
ALY.ServiceInterface.Rest = {
buildRequest: function buildRequest(req) {
ALY.ServiceInterface.Rest.populateMethod(req);
ALY.ServiceInterface.Rest.populateURI(req);
ALY.ServiceInterface.Rest.populateHeaders(req);
},
extractError: function extractError() {
},
extractData: function extractData(resp) {
var req = resp.request;
var data = {};
var r = resp.httpResponse;
var operation = req.service.api.operations[req.operation];
var rules = (operation.output || {}).members || {};
// normalize headers names to lower-cased keys for matching
var headers = {};
ALY.util.each(r.headers, function (k, v) {
headers[k.toLowerCase()] = v;
});
ALY.util.each(rules, function (name, rule) {
if (rule.location === 'header') {
var header = (rule.name || name).toLowerCase();
if (rule.type == 'map') {
data[name] = {};
ALY.util.each(r.headers, function (k, v) {
var result = k.match(new RegExp('^' + rule.name + '(.+)', 'i'));
if (result !== null) {
data[name][result[1]] = v;
}
});
}
if (headers[header] !== undefined) {
data[name] = headers[header];
}
}
if (rule.location === 'status') {
data[name] = parseInt(r.statusCode, 10);
}
});
resp.data = data;
},
populateMethod: function populateMethod(req) {
req.httpRequest.method = req.service.api.operations[req.operation].http.method;
},
populateURI: function populateURI(req) {
var operation = req.service.api.operations[req.operation];
var uri = operation.http.uri;
var pathPattern = uri.split(/\?/)[0];
var rules = (operation.input || {}).members || {};
var escapePathParam = req.service.escapePathParam ||
ALY.ServiceInterface.Rest.escapePathParam;
var escapeQuerystringParam = req.service.escapeQuerystringParam ||
ALY.ServiceInterface.Rest.escapeQuerystringParam;
ALY.util.each.call(this, rules, function (name, rule) {
if (rule.location == 'uri' && req.params[name] != null) {
// if the value is being inserted into the path portion of the
// URI, then we need to use a different (potentially) escaping
// pattern, this is especially true for S3 path params like Key.
var value = pathPattern.match('{' + name + '}') ?
escapePathParam(req.params[name]) :
escapeQuerystringParam(req.params[name]);
uri = uri.replace('{' + name + '}', value);
}
});
var path = uri.split('?')[0];
var querystring = uri.split('?')[1];
if (querystring) {
var parts = [];
ALY.util.arrayEach(querystring.split('&'), function (part) {
if (!part.match('{\\w+}')) parts.push(part);
});
uri = (parts.length > 0 ? path + '?' + parts.join('&') : path);
} else {
uri = path;
}
req.httpRequest.path = uri;
},
escapePathParam: function escapePathParam(value) {
return ALY.util.uriEscape(String(value));
},
escapeQuerystringParam: function escapeQuerystringParam(value) {
return ALY.util.uriEscape(String(value));
},
populateHeaders: function populateHeaders(req) {
var operation = req.service.api.operations[req.operation];
var rules = (operation.input || {}).members || {};
ALY.util.each.call(this, rules, function (name, rule) {
if (rule.location === 'header' && req.params[name]) {
if (rule.type === 'map') {
ALY.util.each(req.params[name], function (key, value) {
req.httpRequest.headers[rule.name + key] = value;
});
} else {
var value = req.params[name];
if (rule.type === 'timestamp') {
var timestampFormat = rule.format || req.service.api.timestampFormat;
value = ALY.util.date.format(value, timestampFormat);
}
req.httpRequest.headers[rule.name || name] = value;
}
}
});
if(req.service.config.securityToken) {
req.httpRequest.headers["x-oss-security-token"] = req.service.config.securityToken;
}
}
};