rest_json.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. var util = require('../util');
  2. var Rest = require('./rest');
  3. var Json = require('./json');
  4. var JsonBuilder = require('../json/builder');
  5. var JsonParser = require('../json/parser');
  6. var METHODS_WITHOUT_BODY = ['GET', 'HEAD', 'DELETE'];
  7. function unsetContentLength(req) {
  8. var payloadMember = util.getRequestPayloadShape(req);
  9. if (
  10. payloadMember === undefined &&
  11. METHODS_WITHOUT_BODY.indexOf(req.httpRequest.method) >= 0
  12. ) {
  13. delete req.httpRequest.headers['Content-Length'];
  14. }
  15. }
  16. function populateBody(req) {
  17. var builder = new JsonBuilder();
  18. var input = req.service.api.operations[req.operation].input;
  19. if (input.payload) {
  20. var params = {};
  21. var payloadShape = input.members[input.payload];
  22. params = req.params[input.payload];
  23. if (payloadShape.type === 'structure') {
  24. req.httpRequest.body = builder.build(params || {}, payloadShape);
  25. applyContentTypeHeader(req);
  26. } else if (params !== undefined) {
  27. // non-JSON payload
  28. req.httpRequest.body = params;
  29. if (payloadShape.type === 'binary' || payloadShape.isStreaming) {
  30. applyContentTypeHeader(req, true);
  31. }
  32. }
  33. } else {
  34. req.httpRequest.body = builder.build(req.params, input);
  35. applyContentTypeHeader(req);
  36. }
  37. }
  38. function applyContentTypeHeader(req, isBinary) {
  39. if (!req.httpRequest.headers['Content-Type']) {
  40. var type = isBinary ? 'binary/octet-stream' : 'application/json';
  41. req.httpRequest.headers['Content-Type'] = type;
  42. }
  43. }
  44. function buildRequest(req) {
  45. Rest.buildRequest(req);
  46. // never send body payload on GET/HEAD/DELETE
  47. if (METHODS_WITHOUT_BODY.indexOf(req.httpRequest.method) < 0) {
  48. populateBody(req);
  49. }
  50. }
  51. function extractError(resp) {
  52. Json.extractError(resp);
  53. }
  54. function extractData(resp) {
  55. Rest.extractData(resp);
  56. var req = resp.request;
  57. var operation = req.service.api.operations[req.operation];
  58. var rules = req.service.api.operations[req.operation].output || {};
  59. var parser;
  60. var hasEventOutput = operation.hasEventOutput;
  61. if (rules.payload) {
  62. var payloadMember = rules.members[rules.payload];
  63. var body = resp.httpResponse.body;
  64. if (payloadMember.isEventStream) {
  65. parser = new JsonParser();
  66. resp.data[payload] = util.createEventStream(
  67. AWS.HttpClient.streamsApiVersion === 2 ? resp.httpResponse.stream : body,
  68. parser,
  69. payloadMember
  70. );
  71. } else if (payloadMember.type === 'structure' || payloadMember.type === 'list') {
  72. var parser = new JsonParser();
  73. resp.data[rules.payload] = parser.parse(body, payloadMember);
  74. } else if (payloadMember.type === 'binary' || payloadMember.isStreaming) {
  75. resp.data[rules.payload] = body;
  76. } else {
  77. resp.data[rules.payload] = payloadMember.toType(body);
  78. }
  79. } else {
  80. var data = resp.data;
  81. Json.extractData(resp);
  82. resp.data = util.merge(data, resp.data);
  83. }
  84. }
  85. /**
  86. * @api private
  87. */
  88. module.exports = {
  89. buildRequest: buildRequest,
  90. extractError: extractError,
  91. extractData: extractData,
  92. unsetContentLength: unsetContentLength
  93. };