dynamodb.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. var AWS = require('../core');
  2. require('../dynamodb/document_client');
  3. AWS.util.update(AWS.DynamoDB.prototype, {
  4. /**
  5. * @api private
  6. */
  7. setupRequestListeners: function setupRequestListeners(request) {
  8. if (request.service.config.dynamoDbCrc32) {
  9. request.removeListener('extractData', AWS.EventListeners.Json.EXTRACT_DATA);
  10. request.addListener('extractData', this.checkCrc32);
  11. request.addListener('extractData', AWS.EventListeners.Json.EXTRACT_DATA);
  12. }
  13. },
  14. /**
  15. * @api private
  16. */
  17. checkCrc32: function checkCrc32(resp) {
  18. if (!resp.httpResponse.streaming && !resp.request.service.crc32IsValid(resp)) {
  19. resp.data = null;
  20. resp.error = AWS.util.error(new Error(), {
  21. code: 'CRC32CheckFailed',
  22. message: 'CRC32 integrity check failed',
  23. retryable: true
  24. });
  25. resp.request.haltHandlersOnError();
  26. throw (resp.error);
  27. }
  28. },
  29. /**
  30. * @api private
  31. */
  32. crc32IsValid: function crc32IsValid(resp) {
  33. var crc = resp.httpResponse.headers['x-amz-crc32'];
  34. if (!crc) return true; // no (valid) CRC32 header
  35. return parseInt(crc, 10) === AWS.util.crypto.crc32(resp.httpResponse.body);
  36. },
  37. /**
  38. * @api private
  39. */
  40. defaultRetryCount: 10,
  41. /**
  42. * @api private
  43. */
  44. retryDelays: function retryDelays(retryCount, err) {
  45. var retryDelayOptions = AWS.util.copy(this.config.retryDelayOptions);
  46. if (typeof retryDelayOptions.base !== 'number') {
  47. retryDelayOptions.base = 50; // default for dynamodb
  48. }
  49. var delay = AWS.util.calculateRetryDelay(retryCount, retryDelayOptions, err);
  50. return delay;
  51. }
  52. });