rest_xml.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. var AWS = require('../core');
  2. var util = require('../util');
  3. var Rest = require('./rest');
  4. function populateBody(req) {
  5. var input = req.service.api.operations[req.operation].input;
  6. var builder = new AWS.XML.Builder();
  7. var params = req.params;
  8. var payload = input.payload;
  9. if (payload) {
  10. var payloadMember = input.members[payload];
  11. params = params[payload];
  12. if (params === undefined) return;
  13. if (payloadMember.type === 'structure') {
  14. var rootElement = payloadMember.name;
  15. req.httpRequest.body = builder.toXML(params, payloadMember, rootElement, true);
  16. } else { // non-xml payload
  17. req.httpRequest.body = params;
  18. }
  19. } else {
  20. req.httpRequest.body = builder.toXML(params, input, input.name ||
  21. input.shape || util.string.upperFirst(req.operation) + 'Request');
  22. }
  23. }
  24. function buildRequest(req) {
  25. Rest.buildRequest(req);
  26. // never send body payload on GET/HEAD
  27. if (['GET', 'HEAD'].indexOf(req.httpRequest.method) < 0) {
  28. populateBody(req);
  29. }
  30. }
  31. function extractError(resp) {
  32. Rest.extractError(resp);
  33. var data;
  34. try {
  35. data = new AWS.XML.Parser().parse(resp.httpResponse.body.toString());
  36. } catch (e) {
  37. data = {
  38. Code: resp.httpResponse.statusCode,
  39. Message: resp.httpResponse.statusMessage
  40. };
  41. }
  42. if (data.Errors) data = data.Errors;
  43. if (data.Error) data = data.Error;
  44. if (data.Code) {
  45. resp.error = util.error(new Error(), {
  46. code: data.Code,
  47. message: data.Message
  48. });
  49. } else {
  50. resp.error = util.error(new Error(), {
  51. code: resp.httpResponse.statusCode,
  52. message: null
  53. });
  54. }
  55. }
  56. function extractData(resp) {
  57. Rest.extractData(resp);
  58. var parser;
  59. var req = resp.request;
  60. var body = resp.httpResponse.body;
  61. var operation = req.service.api.operations[req.operation];
  62. var output = operation.output;
  63. var hasEventOutput = operation.hasEventOutput;
  64. var payload = output.payload;
  65. if (payload) {
  66. var payloadMember = output.members[payload];
  67. if (payloadMember.isEventStream) {
  68. parser = new AWS.XML.Parser();
  69. resp.data[payload] = util.createEventStream(
  70. AWS.HttpClient.streamsApiVersion === 2 ? resp.httpResponse.stream : resp.httpResponse.body,
  71. parser,
  72. payloadMember
  73. );
  74. } else if (payloadMember.type === 'structure') {
  75. parser = new AWS.XML.Parser();
  76. resp.data[payload] = parser.parse(body.toString(), payloadMember);
  77. } else if (payloadMember.type === 'binary' || payloadMember.isStreaming) {
  78. resp.data[payload] = body;
  79. } else {
  80. resp.data[payload] = payloadMember.toType(body);
  81. }
  82. } else if (body.length > 0) {
  83. parser = new AWS.XML.Parser();
  84. var data = parser.parse(body.toString(), output);
  85. util.update(resp.data, data);
  86. }
  87. }
  88. /**
  89. * @api private
  90. */
  91. module.exports = {
  92. buildRequest: buildRequest,
  93. extractError: extractError,
  94. extractData: extractData
  95. };