Skip to content

Commit c54aff5

Browse files
committed
chore: remove input[requestAlgorithmMember] if set by SDK
1 parent b2757b7 commit c54aff5

File tree

2 files changed

+77
-18
lines changed

2 files changed

+77
-18
lines changed

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

Lines changed: 62 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { BuildHandlerArguments } from "@smithy/types";
33
import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest";
44

55
import { PreviouslyResolved } from "./configuration";
6-
import { ChecksumAlgorithm, RequestChecksumCalculation } from "./constants";
6+
import { ChecksumAlgorithm, DEFAULT_CHECKSUM_ALGORITHM, RequestChecksumCalculation } from "./constants";
77
import { flexibleChecksumsMiddleware } from "./flexibleChecksumsMiddleware";
88
import { getChecksumAlgorithmForRequest } from "./getChecksumAlgorithmForRequest";
99
import { getChecksumLocationName } from "./getChecksumLocationName";
@@ -34,7 +34,7 @@ describe(flexibleChecksumsMiddleware.name, () => {
3434
const mockConfig = {
3535
requestChecksumCalculation: () => Promise.resolve(RequestChecksumCalculation.WHEN_REQUIRED),
3636
} as PreviouslyResolved;
37-
const mockMiddlewareConfig = { input: mockInput, requestChecksumRequired: false };
37+
const mockMiddlewareConfig = { requestChecksumRequired: false };
3838

3939
const mockBody = { body: "mockRequestBody" };
4040
const mockHeaders = { "content-length": 100, "content-encoding": "gzip" };
@@ -78,17 +78,66 @@ describe(flexibleChecksumsMiddleware.name, () => {
7878
expect(getChecksumAlgorithmForRequest).toHaveBeenCalledTimes(1);
7979
});
8080

81-
it("skip if header is already present", async () => {
82-
const handler = flexibleChecksumsMiddleware(mockConfig, mockMiddlewareConfig)(mockNext, {});
83-
vi.mocked(hasHeaderWithPrefix).mockReturnValue(true);
84-
85-
await handler(mockArgs);
86-
87-
expect(hasHeaderWithPrefix).toHaveBeenCalledTimes(1);
88-
expect(getChecksumLocationName).not.toHaveBeenCalled();
89-
expect(selectChecksumAlgorithmFunction).not.toHaveBeenCalled();
90-
expect(hasHeader).not.toHaveBeenCalled();
91-
expect(mockNext).toHaveBeenCalledWith(mockArgs);
81+
describe("skip if header is already present", async () => {
82+
beforeEach(() => {
83+
vi.mocked(hasHeaderWithPrefix).mockReturnValue(true);
84+
});
85+
86+
afterEach(() => {
87+
expect(hasHeaderWithPrefix).toHaveBeenCalledTimes(1);
88+
expect(getChecksumLocationName).not.toHaveBeenCalled();
89+
expect(selectChecksumAlgorithmFunction).not.toHaveBeenCalled();
90+
expect(hasHeader).not.toHaveBeenCalled();
91+
});
92+
93+
it("with no changes input", async () => {
94+
const handler = flexibleChecksumsMiddleware(mockConfig, mockMiddlewareConfig)(mockNext, {});
95+
96+
await handler(mockArgs);
97+
expect(mockNext).toHaveBeenCalledWith(mockArgs);
98+
});
99+
100+
describe("handles input[requestAlgorithmMember]", () => {
101+
it("removes if respective checksum header is not present", async () => {
102+
const mockRequestAlgorithmMember = "mockRequestAlgorithmMember";
103+
const handler = flexibleChecksumsMiddleware(mockConfig, {
104+
...mockMiddlewareConfig,
105+
requestAlgorithmMember: mockRequestAlgorithmMember,
106+
})(mockNext, {});
107+
108+
const mockArgsWithInput = {
109+
...mockArgs,
110+
input: { [mockRequestAlgorithmMember]: DEFAULT_CHECKSUM_ALGORITHM },
111+
};
112+
await handler(mockArgsWithInput);
113+
expect(mockNext).toHaveBeenCalledWith(mockArgs);
114+
expect(mockNext.mock.calls[0][0].input[mockRequestAlgorithmMember]).toBeUndefined();
115+
});
116+
117+
// This means user set the checksum algorithm, as well as the actual checksum.
118+
it("retains if respective checksum header is present", async () => {
119+
const mockRequestAlgorithmMember = "mockRequestAlgorithmMember";
120+
const handler = flexibleChecksumsMiddleware(mockConfig, {
121+
...mockMiddlewareConfig,
122+
requestAlgorithmMember: mockRequestAlgorithmMember,
123+
})(mockNext, {});
124+
125+
const mockArgsWithInputAndRequest = {
126+
...mockArgs,
127+
input: { [mockRequestAlgorithmMember]: DEFAULT_CHECKSUM_ALGORITHM },
128+
request: {
129+
...mockRequest,
130+
headers: {
131+
...mockHeaders,
132+
[`x-amz-checksum-${DEFAULT_CHECKSUM_ALGORITHM.toLowerCase()}`]: mockChecksum,
133+
},
134+
},
135+
};
136+
await handler(mockArgsWithInputAndRequest);
137+
expect(mockNext).toHaveBeenCalledWith(mockArgsWithInputAndRequest);
138+
expect(mockNext.mock.calls[0][0].input[mockRequestAlgorithmMember]).toBe(DEFAULT_CHECKSUM_ALGORITHM);
139+
});
140+
});
92141
});
93142
});
94143
});

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
} from "@smithy/types";
1212

1313
import { PreviouslyResolved } from "./configuration";
14-
import { ChecksumAlgorithm } from "./constants";
14+
import { ChecksumAlgorithm, DEFAULT_CHECKSUM_ALGORITHM } from "./constants";
1515
import { getChecksumAlgorithmForRequest } from "./getChecksumAlgorithmForRequest";
1616
import { getChecksumLocationName } from "./getChecksumLocationName";
1717
import { hasHeader } from "./hasHeader";
@@ -65,15 +65,25 @@ export const flexibleChecksumsMiddleware =
6565
return next(args);
6666
}
6767

68-
if (hasHeaderWithPrefix("x-amz-checksum-", args.request.headers)) {
68+
const { request, input } = args;
69+
const { body: requestBody, headers } = request;
70+
const { requestChecksumRequired, requestAlgorithmMember } = middlewareConfig;
71+
72+
if (hasHeaderWithPrefix("x-amz-checksum-", headers)) {
73+
// Remove input[requestAlgorithmMember] and header, if it was added by flexibleChecksumsInputMiddleware
74+
if (
75+
requestAlgorithmMember &&
76+
input[requestAlgorithmMember] === DEFAULT_CHECKSUM_ALGORITHM &&
77+
!headers[`x-amz-checksum-${DEFAULT_CHECKSUM_ALGORITHM.toLowerCase()}`]
78+
) {
79+
delete input[requestAlgorithmMember];
80+
delete headers["x-amz-sdk-checksum-algorithm"];
81+
}
6982
return next(args);
7083
}
7184

72-
const { request, input } = args;
73-
const { body: requestBody, headers } = request;
7485
const { base64Encoder, streamHasher } = config;
7586
const requestChecksumCalculation = await config.requestChecksumCalculation();
76-
const { requestChecksumRequired, requestAlgorithmMember } = middlewareConfig;
7787

7888
const checksumAlgorithm = getChecksumAlgorithmForRequest(input, {
7989
requestChecksumRequired,

0 commit comments

Comments
 (0)