From 745d2ecda125cc84e9a53e6e68ba79095024cf26 Mon Sep 17 00:00:00 2001 From: "Kamat, Trivikram" <16024985+trivikr@users.noreply.github.com> Date: Wed, 23 Feb 2022 01:35:54 +0000 Subject: [PATCH] test(client-s3): flexible checksums with body sent as a stream --- .../client-s3/test/flexibleChecksums.spec.ts | 78 +++++++++++++++---- 1 file changed, 61 insertions(+), 17 deletions(-) diff --git a/clients/client-s3/test/flexibleChecksums.spec.ts b/clients/client-s3/test/flexibleChecksums.spec.ts index d8e1166b0988..a61a23121d97 100644 --- a/clients/client-s3/test/flexibleChecksums.spec.ts +++ b/clients/client-s3/test/flexibleChecksums.spec.ts @@ -34,27 +34,71 @@ describe("Flexible Checksums", () => { testCases.forEach(([body, checksumAlgorithm, checksumValue]) => { const checksumHeader = `x-amz-checksum-${checksumAlgorithm.toLowerCase()}`; - it(`sets ${checksumHeader}="${checksumValue}"" for checksum="${checksumAlgorithm}"`, async () => { - const requestChecksumValidator: BuildMiddleware = (next) => async (args) => { - // middleware intercept the request and return it early - const request = args.request as HttpRequest; - const { headers } = request; - expect(headers["x-amz-sdk-checksum-algorithm"]).to.equal(checksumAlgorithm); - expect(headers[checksumHeader]).to.equal(checksumValue); - return { output: {} as any, response: {} as any }; + describe(`sets ${checksumHeader}="${checksumValue}"" for checksum="${checksumAlgorithm}"`, () => { + const getBodyAsReadableStream = (content: string) => { + const readableStream = new Readable(); + const separator = " "; + const wordsAsChunks = content.split(separator); + wordsAsChunks.forEach((word, index) => { + readableStream.push(word); + if (index !== wordsAsChunks.length - 1) { + readableStream.push(separator); + } + }); + readableStream.push(null); + return readableStream; }; - const client = new S3({}); - client.middlewareStack.addRelativeTo(requestChecksumValidator, { - relation: "after", - toMiddleware: "flexibleChecksumsMiddleware", + it(`when body is sent as a request`, async () => { + const requestChecksumValidator: BuildMiddleware = (next) => async (args) => { + // middleware intercept the request and return it early + const request = args.request as HttpRequest; + const { headers } = request; + expect(headers["x-amz-sdk-checksum-algorithm"]).to.equal(checksumAlgorithm); + expect(headers[checksumHeader]).to.equal(checksumValue); + return { output: {} as any, response: {} as any }; + }; + + const client = new S3({}); + client.middlewareStack.addRelativeTo(requestChecksumValidator, { + relation: "after", + toMiddleware: "flexibleChecksumsMiddleware", + }); + + return await client.putObject({ + Bucket: "bucket", + Key: "key", + Body: body, + ChecksumAlgorithm: checksumAlgorithm, + }); }); - return await client.putObject({ - Bucket: "bucket", - Key: "key", - Body: body, - ChecksumAlgorithm: checksumAlgorithm, + it(`when body is sent as a stream`, async () => { + const requestChecksumValidator: BuildMiddleware = (next) => async (args) => { + // middleware intercept the request and return it early + const request = args.request as HttpRequest; + const { headers } = request; + expect(headers["content-length"]).to.be.undefined; + expect(headers["content-encoding"]).to.equal("aws-chunked"); + expect(headers["transfer-encoding"]).to.equal("chunked"); + expect(headers["x-amz-content-sha256"]).to.equal("STREAMING-UNSIGNED-PAYLOAD-TRAILER"); + expect(headers["x-amz-trailer"]).to.equal(checksumHeader); + return { output: {} as any, response: {} as any }; + }; + + const client = new S3({}); + client.middlewareStack.addRelativeTo(requestChecksumValidator, { + relation: "after", + toMiddleware: "flexibleChecksumsMiddleware", + }); + + const bodyStream = getBodyAsReadableStream(body); + return await client.putObject({ + Bucket: "bucket", + Key: "key", + Body: bodyStream, + ChecksumAlgorithm: checksumAlgorithm, + }); }); }); });