sqs.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. var AWS = require('../core');
  2. AWS.util.update(AWS.SQS.prototype, {
  3. /**
  4. * @api private
  5. */
  6. setupRequestListeners: function setupRequestListeners(request) {
  7. request.addListener('build', this.buildEndpoint);
  8. if (request.service.config.computeChecksums) {
  9. if (request.operation === 'sendMessage') {
  10. request.addListener('extractData', this.verifySendMessageChecksum);
  11. } else if (request.operation === 'sendMessageBatch') {
  12. request.addListener('extractData', this.verifySendMessageBatchChecksum);
  13. } else if (request.operation === 'receiveMessage') {
  14. request.addListener('extractData', this.verifyReceiveMessageChecksum);
  15. }
  16. }
  17. },
  18. /**
  19. * @api private
  20. */
  21. verifySendMessageChecksum: function verifySendMessageChecksum(response) {
  22. if (!response.data) return;
  23. var md5 = response.data.MD5OfMessageBody;
  24. var body = this.params.MessageBody;
  25. var calculatedMd5 = this.service.calculateChecksum(body);
  26. if (calculatedMd5 !== md5) {
  27. var msg = 'Got "' + response.data.MD5OfMessageBody +
  28. '", expecting "' + calculatedMd5 + '".';
  29. this.service.throwInvalidChecksumError(response,
  30. [response.data.MessageId], msg);
  31. }
  32. },
  33. /**
  34. * @api private
  35. */
  36. verifySendMessageBatchChecksum: function verifySendMessageBatchChecksum(response) {
  37. if (!response.data) return;
  38. var service = this.service;
  39. var entries = {};
  40. var errors = [];
  41. var messageIds = [];
  42. AWS.util.arrayEach(response.data.Successful, function (entry) {
  43. entries[entry.Id] = entry;
  44. });
  45. AWS.util.arrayEach(this.params.Entries, function (entry) {
  46. if (entries[entry.Id]) {
  47. var md5 = entries[entry.Id].MD5OfMessageBody;
  48. var body = entry.MessageBody;
  49. if (!service.isChecksumValid(md5, body)) {
  50. errors.push(entry.Id);
  51. messageIds.push(entries[entry.Id].MessageId);
  52. }
  53. }
  54. });
  55. if (errors.length > 0) {
  56. service.throwInvalidChecksumError(response, messageIds,
  57. 'Invalid messages: ' + errors.join(', '));
  58. }
  59. },
  60. /**
  61. * @api private
  62. */
  63. verifyReceiveMessageChecksum: function verifyReceiveMessageChecksum(response) {
  64. if (!response.data) return;
  65. var service = this.service;
  66. var messageIds = [];
  67. AWS.util.arrayEach(response.data.Messages, function(message) {
  68. var md5 = message.MD5OfBody;
  69. var body = message.Body;
  70. if (!service.isChecksumValid(md5, body)) {
  71. messageIds.push(message.MessageId);
  72. }
  73. });
  74. if (messageIds.length > 0) {
  75. service.throwInvalidChecksumError(response, messageIds,
  76. 'Invalid messages: ' + messageIds.join(', '));
  77. }
  78. },
  79. /**
  80. * @api private
  81. */
  82. throwInvalidChecksumError: function throwInvalidChecksumError(response, ids, message) {
  83. response.error = AWS.util.error(new Error(), {
  84. retryable: true,
  85. code: 'InvalidChecksum',
  86. messageIds: ids,
  87. message: response.request.operation +
  88. ' returned an invalid MD5 response. ' + message
  89. });
  90. },
  91. /**
  92. * @api private
  93. */
  94. isChecksumValid: function isChecksumValid(checksum, data) {
  95. return this.calculateChecksum(data) === checksum;
  96. },
  97. /**
  98. * @api private
  99. */
  100. calculateChecksum: function calculateChecksum(data) {
  101. return AWS.util.crypto.md5(data, 'hex');
  102. },
  103. /**
  104. * @api private
  105. */
  106. buildEndpoint: function buildEndpoint(request) {
  107. var url = request.httpRequest.params.QueueUrl;
  108. if (url) {
  109. request.httpRequest.endpoint = new AWS.Endpoint(url);
  110. // signature version 4 requires the region name to be set,
  111. // sqs queue urls contain the region name
  112. var matches = request.httpRequest.endpoint.host.match(/^sqs\.(.+?)\./);
  113. if (matches) request.httpRequest.region = matches[1];
  114. }
  115. }
  116. });