Backend half
This commit is contained in:
+110
@@ -0,0 +1,110 @@
|
||||
var AWS = require('../core');
|
||||
var util = require('../util');
|
||||
var QueryParamSerializer = require('../query/query_param_serializer');
|
||||
var Shape = require('../model/shape');
|
||||
var populateHostPrefix = require('./helpers').populateHostPrefix;
|
||||
|
||||
function buildRequest(req) {
|
||||
var operation = req.service.api.operations[req.operation];
|
||||
var httpRequest = req.httpRequest;
|
||||
httpRequest.headers['Content-Type'] =
|
||||
'application/x-www-form-urlencoded; charset=utf-8';
|
||||
httpRequest.params = {
|
||||
Version: req.service.api.apiVersion,
|
||||
Action: operation.name
|
||||
};
|
||||
|
||||
// convert the request parameters into a list of query params,
|
||||
// e.g. Deeply.NestedParam.0.Name=value
|
||||
var builder = new QueryParamSerializer();
|
||||
builder.serialize(req.params, operation.input, function(name, value) {
|
||||
httpRequest.params[name] = value;
|
||||
});
|
||||
httpRequest.body = util.queryParamsToString(httpRequest.params);
|
||||
|
||||
populateHostPrefix(req);
|
||||
}
|
||||
|
||||
function extractError(resp) {
|
||||
var data, body = resp.httpResponse.body.toString();
|
||||
if (body.match('<UnknownOperationException')) {
|
||||
data = {
|
||||
Code: 'UnknownOperation',
|
||||
Message: 'Unknown operation ' + resp.request.operation
|
||||
};
|
||||
} else {
|
||||
try {
|
||||
data = new AWS.XML.Parser().parse(body);
|
||||
} catch (e) {
|
||||
data = {
|
||||
Code: resp.httpResponse.statusCode,
|
||||
Message: resp.httpResponse.statusMessage
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if (data.requestId && !resp.requestId) resp.requestId = data.requestId;
|
||||
if (data.Errors) data = data.Errors;
|
||||
if (data.Error) data = data.Error;
|
||||
if (data.Code) {
|
||||
resp.error = util.error(new Error(), {
|
||||
code: data.Code,
|
||||
message: data.Message
|
||||
});
|
||||
} else {
|
||||
resp.error = util.error(new Error(), {
|
||||
code: resp.httpResponse.statusCode,
|
||||
message: null
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function extractData(resp) {
|
||||
var req = resp.request;
|
||||
var operation = req.service.api.operations[req.operation];
|
||||
var shape = operation.output || {};
|
||||
var origRules = shape;
|
||||
|
||||
if (origRules.resultWrapper) {
|
||||
var tmp = Shape.create({type: 'structure'});
|
||||
tmp.members[origRules.resultWrapper] = shape;
|
||||
tmp.memberNames = [origRules.resultWrapper];
|
||||
util.property(shape, 'name', shape.resultWrapper);
|
||||
shape = tmp;
|
||||
}
|
||||
|
||||
var parser = new AWS.XML.Parser();
|
||||
|
||||
// TODO: Refactor XML Parser to parse RequestId from response.
|
||||
if (shape && shape.members && !shape.members._XAMZRequestId) {
|
||||
var requestIdShape = Shape.create(
|
||||
{ type: 'string' },
|
||||
{ api: { protocol: 'query' } },
|
||||
'requestId'
|
||||
);
|
||||
shape.members._XAMZRequestId = requestIdShape;
|
||||
}
|
||||
|
||||
var data = parser.parse(resp.httpResponse.body.toString(), shape);
|
||||
resp.requestId = data._XAMZRequestId || data.requestId;
|
||||
|
||||
if (data._XAMZRequestId) delete data._XAMZRequestId;
|
||||
|
||||
if (origRules.resultWrapper) {
|
||||
if (data[origRules.resultWrapper]) {
|
||||
util.update(data, data[origRules.resultWrapper]);
|
||||
delete data[origRules.resultWrapper];
|
||||
}
|
||||
}
|
||||
|
||||
resp.data = data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @api private
|
||||
*/
|
||||
module.exports = {
|
||||
buildRequest: buildRequest,
|
||||
extractError: extractError,
|
||||
extractData: extractData
|
||||
};
|
||||
Reference in New Issue
Block a user