Skip to content

Commit d718416

Browse files
committed
chore(middleware-flexible-checksums): use RequestChecksumCalculation
1 parent 9b2dac1 commit d718416

File tree

5 files changed

+104
-21
lines changed

5 files changed

+104
-21
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
Encoder,
55
GetAwsChunkedEncodingStream,
66
HashConstructor,
7+
Provider,
78
StreamCollector,
89
StreamHasher,
910
} from "@smithy/types";
@@ -53,4 +54,9 @@ export interface PreviouslyResolved {
5354
* Collects streams into buffers.
5455
*/
5556
streamCollector: StreamCollector;
57+
58+
/**
59+
* Determines when a checksum will be calculated for request payloads
60+
*/
61+
requestChecksumCalculation: Provider<string>;
5662
}

packages/middleware-flexible-checksums/src/flexibleChecksumsMiddleware.spec.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { HttpRequest } from "@smithy/protocol-http";
22
import { BuildHandlerArguments } from "@smithy/types";
33

44
import { PreviouslyResolved } from "./configuration";
5-
import { ChecksumAlgorithm } from "./constants";
5+
import { ChecksumAlgorithm, RequestChecksumCalculation } from "./constants";
66
import { flexibleChecksumsMiddleware } from "./flexibleChecksumsMiddleware";
77
import { getChecksumAlgorithmForRequest } from "./getChecksumAlgorithmForRequest";
88
import { getChecksumLocationName } from "./getChecksumLocationName";
@@ -27,7 +27,9 @@ describe(flexibleChecksumsMiddleware.name, () => {
2727
const mockChecksumLocationName = "mock-checksum-location-name";
2828

2929
const mockInput = {};
30-
const mockConfig = {} as PreviouslyResolved;
30+
const mockConfig = {
31+
requestChecksumCalculation: () => Promise.resolve(RequestChecksumCalculation.WHEN_REQUIRED),
32+
} as PreviouslyResolved;
3133
const mockMiddlewareConfig = { input: mockInput, requestChecksumRequired: false };
3234

3335
const mockBody = { body: "mockRequestBody" };

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,15 @@ export const flexibleChecksumsMiddleware =
5858
const { request } = args;
5959
const { body: requestBody, headers } = request;
6060
const { base64Encoder, streamHasher } = config;
61+
const requestChecksumCalculation = await config.requestChecksumCalculation();
6162
const { input, requestChecksumRequired, requestAlgorithmMember } = middlewareConfig;
6263

6364
const checksumAlgorithm = getChecksumAlgorithmForRequest(
6465
input,
6566
{
6667
requestChecksumRequired,
6768
requestAlgorithmMember,
69+
requestChecksumCalculation,
6870
},
6971
!!context.isS3ExpressBucket
7072
);

packages/middleware-flexible-checksums/src/getChecksumAlgorithmForRequest.spec.ts

Lines changed: 71 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,93 @@
1-
import { ChecksumAlgorithm } from "./constants";
1+
import { DEFAULT_CHECKSUM_ALGORITHM, RequestChecksumCalculation } from "./constants";
22
import { getChecksumAlgorithmForRequest } from "./getChecksumAlgorithmForRequest";
33
import { CLIENT_SUPPORTED_ALGORITHMS } from "./types";
44

55
describe(getChecksumAlgorithmForRequest.name, () => {
66
const mockRequestAlgorithmMember = "mockRequestAlgorithmMember";
77

88
describe("when requestAlgorithmMember is not provided", () => {
9-
it("returns MD5 if requestChecksumRequired is set", () => {
10-
expect(getChecksumAlgorithmForRequest({}, { requestChecksumRequired: true })).toEqual(ChecksumAlgorithm.MD5);
9+
describe(`when requestChecksumCalculation is '${RequestChecksumCalculation.WHEN_REQUIRED}'`, () => {
10+
const mockOptions = { requestChecksumCalculation: RequestChecksumCalculation.WHEN_REQUIRED };
11+
12+
it(`returns ${DEFAULT_CHECKSUM_ALGORITHM} if requestChecksumRequired is set`, () => {
13+
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: true })).toEqual(
14+
DEFAULT_CHECKSUM_ALGORITHM
15+
);
16+
});
17+
18+
it("returns undefined if requestChecksumRequired is false", () => {
19+
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: false })).toBeUndefined();
20+
});
1121
});
1222

13-
it("returns undefined if requestChecksumRequired is false", () => {
14-
expect(getChecksumAlgorithmForRequest({}, { requestChecksumRequired: false })).toBeUndefined();
23+
describe(`when requestChecksumCalculation is '${RequestChecksumCalculation.WHEN_SUPPORTED}'`, () => {
24+
const mockOptions = { requestChecksumCalculation: RequestChecksumCalculation.WHEN_SUPPORTED };
25+
26+
it(`returns ${DEFAULT_CHECKSUM_ALGORITHM} if requestChecksumRequired is set`, () => {
27+
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: true })).toEqual(
28+
DEFAULT_CHECKSUM_ALGORITHM
29+
);
30+
});
31+
32+
it(`returns ${DEFAULT_CHECKSUM_ALGORITHM} if requestChecksumRequired is false`, () => {
33+
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: false })).toEqual(
34+
DEFAULT_CHECKSUM_ALGORITHM
35+
);
36+
});
1537
});
1638
});
1739

1840
describe("when requestAlgorithmMember is not set in input", () => {
19-
const mockOptions = { requestAlgorithmMember: mockRequestAlgorithmMember };
41+
const mockOptionsWithAlgoMember = { requestAlgorithmMember: mockRequestAlgorithmMember };
2042

21-
it("returns MD5 if requestChecksumRequired is set", () => {
22-
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: true })).toEqual(
23-
ChecksumAlgorithm.MD5
24-
);
43+
describe(`when requestChecksumCalculation is '${RequestChecksumCalculation.WHEN_REQUIRED}'`, () => {
44+
const mockOptions = {
45+
...mockOptionsWithAlgoMember,
46+
requestChecksumCalculation: RequestChecksumCalculation.WHEN_REQUIRED,
47+
};
48+
49+
it(`returns ${DEFAULT_CHECKSUM_ALGORITHM} if requestChecksumRequired is set`, () => {
50+
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: true })).toEqual(
51+
DEFAULT_CHECKSUM_ALGORITHM
52+
);
53+
});
54+
55+
it("returns undefined if requestChecksumRequired is false", () => {
56+
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: false })).toBeUndefined();
57+
});
2558
});
2659

27-
it("returns undefined if requestChecksumRequired is false", () => {
28-
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: false })).toBeUndefined();
60+
describe(`when requestChecksumCalculation is '${RequestChecksumCalculation.WHEN_SUPPORTED}'`, () => {
61+
const mockOptions = {
62+
...mockOptionsWithAlgoMember,
63+
requestChecksumCalculation: RequestChecksumCalculation.WHEN_SUPPORTED,
64+
};
65+
66+
it(`returns ${DEFAULT_CHECKSUM_ALGORITHM} if requestChecksumRequired is set`, () => {
67+
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: true })).toEqual(
68+
DEFAULT_CHECKSUM_ALGORITHM
69+
);
70+
});
71+
72+
it(`returns ${DEFAULT_CHECKSUM_ALGORITHM} if requestChecksumRequired is false`, () => {
73+
expect(getChecksumAlgorithmForRequest({}, { ...mockOptions, requestChecksumRequired: false })).toEqual(
74+
DEFAULT_CHECKSUM_ALGORITHM
75+
);
76+
});
2977
});
3078
});
3179

3280
it("throws error if input[requestAlgorithmMember] if not supported by client", () => {
3381
const unsupportedAlgo = "unsupportedAlgo";
3482
const mockInput = { [mockRequestAlgorithmMember]: unsupportedAlgo };
35-
const mockOptions = { requestChecksumRequired: true, requestAlgorithmMember: mockRequestAlgorithmMember };
83+
const mockOptions = {
84+
requestChecksumRequired: true,
85+
requestAlgorithmMember: mockRequestAlgorithmMember,
86+
requestChecksumCalculation: RequestChecksumCalculation.WHEN_REQUIRED,
87+
};
3688
expect(() => {
3789
getChecksumAlgorithmForRequest(mockInput, mockOptions);
38-
}).toThrowError(
90+
}).toThrow(
3991
`The checksum algorithm "${unsupportedAlgo}" is not supported by the client.` +
4092
` Select one of ${CLIENT_SUPPORTED_ALGORITHMS}.`
4193
);
@@ -44,7 +96,11 @@ describe(getChecksumAlgorithmForRequest.name, () => {
4496
describe("returns input[requestAlgorithmMember] if supported by client", () => {
4597
it.each(CLIENT_SUPPORTED_ALGORITHMS)("Supported algorithm: %s", (supportedAlgorithm) => {
4698
const mockInput = { [mockRequestAlgorithmMember]: supportedAlgorithm };
47-
const mockOptions = { requestChecksumRequired: true, requestAlgorithmMember: mockRequestAlgorithmMember };
99+
const mockOptions = {
100+
requestChecksumRequired: true,
101+
requestAlgorithmMember: mockRequestAlgorithmMember,
102+
requestChecksumCalculation: RequestChecksumCalculation.WHEN_REQUIRED,
103+
};
48104
expect(getChecksumAlgorithmForRequest(mockInput, mockOptions)).toEqual(supportedAlgorithm);
49105
});
50106
});

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { ChecksumAlgorithm, DEFAULT_CHECKSUM_ALGORITHM, S3_EXPRESS_DEFAULT_CHECKSUM_ALGORITHM } from "./constants";
1+
import {
2+
ChecksumAlgorithm,
3+
DEFAULT_CHECKSUM_ALGORITHM,
4+
RequestChecksumCalculation,
5+
S3_EXPRESS_DEFAULT_CHECKSUM_ALGORITHM,
6+
} from "./constants";
27
import { CLIENT_SUPPORTED_ALGORITHMS } from "./types";
38

49
export interface GetChecksumAlgorithmForRequestOptions {
@@ -11,6 +16,11 @@ export interface GetChecksumAlgorithmForRequestOptions {
1116
* Defines a top-level operation input member that is used to configure request checksum behavior.
1217
*/
1318
requestAlgorithmMember?: string;
19+
20+
/**
21+
* Determines when a checksum will be calculated for request payloads
22+
*/
23+
requestChecksumCalculation: string;
1424
}
1525

1626
/**
@@ -20,16 +30,23 @@ export interface GetChecksumAlgorithmForRequestOptions {
2030
*/
2131
export const getChecksumAlgorithmForRequest = (
2232
input: any,
23-
{ requestChecksumRequired, requestAlgorithmMember }: GetChecksumAlgorithmForRequestOptions,
33+
{
34+
requestChecksumRequired,
35+
requestAlgorithmMember,
36+
requestChecksumCalculation,
37+
}: GetChecksumAlgorithmForRequestOptions,
2438
isS3Express?: boolean
2539
): ChecksumAlgorithm | undefined => {
2640
const defaultAlgorithm = isS3Express ? S3_EXPRESS_DEFAULT_CHECKSUM_ALGORITHM : DEFAULT_CHECKSUM_ALGORITHM;
2741

2842
// Either the Operation input member that is used to configure request checksum behavior is not set, or
2943
// the value for input member to configure flexible checksum is not set.
3044
if (!requestAlgorithmMember || !input[requestAlgorithmMember]) {
31-
// Select an algorithm only if request checksum is required.
32-
return requestChecksumRequired ? defaultAlgorithm : undefined;
45+
// Select an algorithm only if request checksum calculation is supported
46+
// or request checksum is required.
47+
return requestChecksumCalculation === RequestChecksumCalculation.WHEN_SUPPORTED || requestChecksumRequired
48+
? defaultAlgorithm
49+
: undefined;
3350
}
3451

3552
const checksumAlgorithm = input[requestAlgorithmMember];

0 commit comments

Comments
 (0)