query.js (2833B)
1 var AWS = require('../core'); 2 var util = require('../util'); 3 var QueryParamSerializer = require('../query/query_param_serializer'); 4 var Shape = require('../model/shape'); 5 6 function buildRequest(req) { 7 var operation = req.service.api.operations[req.operation]; 8 var httpRequest = req.httpRequest; 9 httpRequest.headers['Content-Type'] = 10 'application/x-www-form-urlencoded; charset=utf-8'; 11 httpRequest.params = { 12 Version: req.service.api.apiVersion, 13 Action: operation.name 14 }; 15 16 // convert the request parameters into a list of query params, 17 // e.g. Deeply.NestedParam.0.Name=value 18 var builder = new QueryParamSerializer(); 19 builder.serialize(req.params, operation.input, function(name, value) { 20 httpRequest.params[name] = value; 21 }); 22 httpRequest.body = util.queryParamsToString(httpRequest.params); 23 } 24 25 function extractError(resp) { 26 var data, body = resp.httpResponse.body.toString(); 27 if (body.match('<UnknownOperationException')) { 28 data = { 29 Code: 'UnknownOperation', 30 Message: 'Unknown operation ' + resp.request.operation 31 }; 32 } else { 33 data = new AWS.XML.Parser().parse(body); 34 } 35 36 if (data.requestId && !resp.requestId) resp.requestId = data.requestId; 37 if (data.Errors) data = data.Errors; 38 if (data.Error) data = data.Error; 39 if (data.Code) { 40 resp.error = util.error(new Error(), { 41 code: data.Code, 42 message: data.Message 43 }); 44 } else { 45 resp.error = util.error(new Error(), { 46 code: resp.httpResponse.statusCode, 47 message: null 48 }); 49 } 50 } 51 52 function extractData(resp) { 53 var req = resp.request; 54 var operation = req.service.api.operations[req.operation]; 55 var shape = operation.output || {}; 56 var origRules = shape; 57 58 if (origRules.resultWrapper) { 59 var tmp = Shape.create({type: 'structure'}); 60 tmp.members[origRules.resultWrapper] = shape; 61 tmp.memberNames = [origRules.resultWrapper]; 62 util.property(shape, 'name', shape.resultWrapper); 63 shape = tmp; 64 } 65 66 var parser = new AWS.XML.Parser(); 67 68 // TODO: Refactor XML Parser to parse RequestId from response. 69 if (shape && shape.members && !shape.members._XAMZRequestId) { 70 var requestIdShape = Shape.create( 71 { type: 'string' }, 72 { api: { protocol: 'query' } }, 73 'requestId' 74 ); 75 shape.members._XAMZRequestId = requestIdShape; 76 } 77 78 var data = parser.parse(resp.httpResponse.body.toString(), shape); 79 resp.requestId = data._XAMZRequestId || data.requestId; 80 81 if (data._XAMZRequestId) delete data._XAMZRequestId; 82 83 if (origRules.resultWrapper) { 84 if (data[origRules.resultWrapper]) { 85 util.update(data, data[origRules.resultWrapper]); 86 delete data[origRules.resultWrapper]; 87 } 88 } 89 90 resp.data = data; 91 } 92 93 module.exports = { 94 buildRequest: buildRequest, 95 extractError: extractError, 96 extractData: extractData 97 };