json.js (1956B)
1 var util = require('../util'); 2 var JsonBuilder = require('../json/builder'); 3 var JsonParser = require('../json/parser'); 4 5 function buildRequest(req) { 6 var httpRequest = req.httpRequest; 7 var api = req.service.api; 8 var target = api.targetPrefix + '.' + api.operations[req.operation].name; 9 var version = api.jsonVersion || '1.0'; 10 var input = api.operations[req.operation].input; 11 var builder = new JsonBuilder(); 12 13 if (version === 1) version = '1.0'; 14 httpRequest.body = builder.build(req.params || {}, input); 15 httpRequest.headers['Content-Type'] = 'application/x-amz-json-' + version; 16 httpRequest.headers['X-Amz-Target'] = target; 17 } 18 19 function extractError(resp) { 20 var error = {}; 21 var httpResponse = resp.httpResponse; 22 23 error.code = httpResponse.headers['x-amzn-errortype'] || 'UnknownError'; 24 if (typeof error.code === 'string') { 25 error.code = error.code.split(':')[0]; 26 } 27 28 if (httpResponse.body.length > 0) { 29 var e = JSON.parse(httpResponse.body.toString()); 30 if (e.__type || e.code) { 31 error.code = (e.__type || e.code).split('#').pop(); 32 } 33 if (error.code === 'RequestEntityTooLarge') { 34 error.message = 'Request body must be less than 1 MB'; 35 } else { 36 error.message = (e.message || e.Message || null); 37 } 38 } else { 39 error.statusCode = httpResponse.statusCode; 40 error.message = httpResponse.statusCode.toString(); 41 } 42 43 resp.error = util.error(new Error(), error); 44 } 45 46 function extractData(resp) { 47 var body = resp.httpResponse.body.toString() || '{}'; 48 if (resp.request.service.config.convertResponseTypes === false) { 49 resp.data = JSON.parse(body); 50 } else { 51 var operation = resp.request.service.api.operations[resp.request.operation]; 52 var shape = operation.output || {}; 53 var parser = new JsonParser(); 54 resp.data = parser.parse(body, shape); 55 } 56 } 57 58 module.exports = { 59 buildRequest: buildRequest, 60 extractError: extractError, 61 extractData: extractData 62 };