Skip to content

Commit f219a78

Browse files
committed
chore(middleware-flexible-checksums): delay checksum computation till stream is read
1 parent 76cb4e8 commit f219a78

File tree

4 files changed

+21
-27
lines changed

4 files changed

+21
-27
lines changed

packages/middleware-flexible-checksums/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"@smithy/types": "^3.6.0",
4141
"@smithy/util-middleware": "^3.0.8",
4242
"@smithy/util-utf8": "^3.0.0",
43+
"@smithy/util-stream": "^3.2.1",
4344
"tslib": "^2.6.2"
4445
},
4546
"devDependencies": {
Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest";
22

33
import { getChecksum } from "./getChecksum";
4-
import { isStreaming } from "./isStreaming";
54
import { stringHasher } from "./stringHasher";
65

7-
vi.mock("./isStreaming");
86
vi.mock("./stringHasher");
97

108
describe(getChecksum.name, () => {
119
const mockOptions = {
12-
streamHasher: vi.fn(),
1310
checksumAlgorithmFn: vi.fn(),
1411
base64Encoder: vi.fn(),
1512
};
@@ -26,21 +23,10 @@ describe(getChecksum.name, () => {
2623
vi.clearAllMocks();
2724
});
2825

29-
it("gets checksum from streamHasher if body is streaming", async () => {
30-
vi.mocked(isStreaming).mockReturnValue(true);
31-
mockOptions.streamHasher.mockResolvedValue(mockRawOutput);
32-
const checksum = await getChecksum(mockBody, mockOptions);
33-
expect(checksum).toEqual(mockOutput);
34-
expect(stringHasher).not.toHaveBeenCalled();
35-
expect(mockOptions.streamHasher).toHaveBeenCalledWith(mockOptions.checksumAlgorithmFn, mockBody);
36-
});
37-
38-
it("gets checksum from stringHasher if body is not streaming", async () => {
39-
vi.mocked(isStreaming).mockReturnValue(false);
26+
it("gets checksum from stringHasher", async () => {
4027
vi.mocked(stringHasher).mockResolvedValue(mockRawOutput);
4128
const checksum = await getChecksum(mockBody, mockOptions);
4229
expect(checksum).toEqual(mockOutput);
43-
expect(mockOptions.streamHasher).not.toHaveBeenCalled();
4430
expect(stringHasher).toHaveBeenCalledWith(mockOptions.checksumAlgorithmFn, mockBody);
4531
});
4632
});
Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
1-
import { ChecksumConstructor, Encoder, HashConstructor, StreamHasher } from "@smithy/types";
1+
import { ChecksumConstructor, Encoder, HashConstructor } from "@smithy/types";
22

3-
import { isStreaming } from "./isStreaming";
43
import { stringHasher } from "./stringHasher";
54

65
export interface GetChecksumDigestOptions {
7-
streamHasher: StreamHasher<any>;
86
checksumAlgorithmFn: ChecksumConstructor | HashConstructor;
97
base64Encoder: Encoder;
108
}
119

12-
export const getChecksum = async (
13-
body: unknown,
14-
{ streamHasher, checksumAlgorithmFn, base64Encoder }: GetChecksumDigestOptions
15-
) => {
16-
const digest = isStreaming(body) ? streamHasher(checksumAlgorithmFn, body) : stringHasher(checksumAlgorithmFn, body);
17-
return base64Encoder(await digest);
18-
};
10+
export const getChecksum = async (body: unknown, { checksumAlgorithmFn, base64Encoder }: GetChecksumDigestOptions) =>
11+
base64Encoder(await stringHasher(checksumAlgorithmFn, body));

packages/middleware-flexible-checksums/src/validateChecksumFromResponse.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import { HttpResponse } from "@smithy/protocol-http";
2+
import { Checksum } from "@smithy/types";
3+
import { createChecksumStream } from "@smithy/util-stream";
24

35
import { PreviouslyResolved } from "./configuration";
46
import { ChecksumAlgorithm } from "./constants";
57
import { getChecksum } from "./getChecksum";
68
import { getChecksumAlgorithmListForResponse } from "./getChecksumAlgorithmListForResponse";
79
import { getChecksumLocationName } from "./getChecksumLocationName";
10+
import { isStreaming } from "./isStreaming";
811
import { selectChecksumAlgorithmFunction } from "./selectChecksumAlgorithmFunction";
912

1013
export interface ValidateChecksumFromResponseOptions {
@@ -29,9 +32,20 @@ export const validateChecksumFromResponse = async (
2932
const checksumFromResponse = responseHeaders[responseHeader];
3033
if (checksumFromResponse) {
3134
const checksumAlgorithmFn = selectChecksumAlgorithmFunction(algorithm as ChecksumAlgorithm, config);
32-
const { streamHasher, base64Encoder } = config;
33-
const checksum = await getChecksum(responseBody, { streamHasher, checksumAlgorithmFn, base64Encoder });
35+
const { base64Encoder } = config;
3436

37+
if (isStreaming(responseBody)) {
38+
createChecksumStream({
39+
expectedChecksum: checksumFromResponse,
40+
checksumSourceLocation: responseHeader,
41+
checksum: new checksumAlgorithmFn() as Checksum,
42+
source: responseBody,
43+
base64Encoder,
44+
});
45+
return;
46+
}
47+
48+
const checksum = await getChecksum(responseBody, { checksumAlgorithmFn, base64Encoder });
3549
if (checksum === checksumFromResponse) {
3650
// The checksum for response payload is valid.
3751
break;

0 commit comments

Comments
 (0)