2014-04-01 00:47:41 -06:00

132 lines
4.1 KiB
JavaScript

var AWS = require('../core');
/**
* @api private
*/
AWS.ServiceInterface.Rest = {
buildRequest: function buildRequest(req) {
AWS.ServiceInterface.Rest.populateMethod(req);
AWS.ServiceInterface.Rest.populateURI(req);
AWS.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 = {};
AWS.util.each(r.headers, function (k, v) {
headers[k.toLowerCase()] = v;
});
AWS.util.each(rules, function (name, rule) {
if (rule.location === 'header') {
var header = (rule.name || name).toLowerCase();
if (rule.type === 'map') {
data[name] = {};
AWS.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 = [req.httpRequest.endpoint.path, operation.http.uri].join('/');
uri = uri.replace(/\/+/g, '/');
var pathPattern = uri.split(/\?/)[0];
var rules = (operation.input || {}).members || {};
var escapePathParam = req.service.escapePathParam ||
AWS.ServiceInterface.Rest.escapePathParam;
var escapeQuerystringParam = req.service.escapeQuerystringParam ||
AWS.ServiceInterface.Rest.escapeQuerystringParam;
AWS.util.each.call(this, rules, function (name, rule) {
if (rule.location === 'uri') {
var paramValue = req.params[name];
if (paramValue === null || paramValue === undefined) return;
// 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(paramValue) :
escapeQuerystringParam(paramValue);
uri = uri.replace('{' + name + '}', value);
}
});
var path = uri.split('?')[0];
var querystring = uri.split('?')[1];
if (querystring) {
var parts = [];
AWS.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 AWS.util.uriEscape(String(value));
},
escapeQuerystringParam: function escapeQuerystringParam(value) {
return AWS.util.uriEscape(String(value));
},
populateHeaders: function populateHeaders(req) {
var operation = req.service.api.operations[req.operation];
var rules = (operation.input || {}).members || {};
AWS.util.each.call(this, rules, function (name, rule) {
if (rule.location === 'header' && req.params[name]) {
if (rule.type === 'map') {
AWS.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 = AWS.util.date.format(value, timestampFormat);
}
req.httpRequest.headers[rule.name || name] = value;
}
}
});
}
};