| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- const Crypto = require('node:crypto')
- /**
- * Creates an S3 client that uses MD5 checksums for DeleteObjects operations
- * https://github.com/aws/aws-sdk-js-v3/blob/main/supplemental-docs/MD5_FALLBACK.md
- */
- const md5Middleware = (next, context) => async args => {
- if (context.commandName !== 'DeleteObjectsCommand') {
- return next(args)
- }
- const headers = args.request.headers
- // Remove any checksum headers added by default middleware
- // This ensures our Content-MD5 is the primary integrity check
- Object.keys(headers).forEach(header => {
- const lowerHeader = header.toLowerCase()
- if (
- lowerHeader.startsWith('x-amz-checksum-') ||
- lowerHeader.startsWith('x-amz-sdk-checksum-')
- ) {
- delete headers[header]
- }
- })
- if (args.request.body) {
- const bodyContent = Buffer.from(args.request.body)
- headers['Content-MD5'] = Crypto.createHash('md5')
- .update(bodyContent)
- .digest('base64')
- }
- return await next(args)
- }
- function addMd5Middleware(client) {
- // Add the middleware relative to the flexible checksums middleware
- // This ensures it runs after default checksums might be added, but before signing
- client.middlewareStack.add(md5Middleware, {
- step: 'build',
- toMiddleware: 'flexibleChecksumsMiddleware',
- name: 'addMD5ChecksumForDeleteObjects',
- tags: ['MD5_FALLBACK'],
- })
- }
- module.exports = {
- addMd5Middleware,
- }
|