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