Skip to content

Commit 2381379

Browse files
committed
chore: use requestAlgorithmMemberHttpHeader to populate header
1 parent c54aff5 commit 2381379

File tree

4 files changed

+67
-146
lines changed

4 files changed

+67
-146
lines changed

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

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -24,69 +24,6 @@ describe(flexibleChecksumsInputMiddleware.name, () => {
2424
vi.clearAllMocks();
2525
});
2626

27-
describe("sets input.requestAlgorithmMember", () => {
28-
describe("input[requestAlgorithmMember] is not defined and", () => {
29-
const mockMiddlewareConfigWithRequestAlgorithmMember = {
30-
...mockMiddlewareConfig,
31-
requestAlgorithmMember: mockRequestAlgorithmMember,
32-
};
33-
34-
it("requestChecksumCalculation is supported", async () => {
35-
const handler = flexibleChecksumsInputMiddleware(mockConfig, mockMiddlewareConfigWithRequestAlgorithmMember)(
36-
mockNext,
37-
{}
38-
);
39-
await handler({ input: {} });
40-
expect(mockNext).toHaveBeenCalledWith({ input: { [mockRequestAlgorithmMember]: DEFAULT_CHECKSUM_ALGORITHM } });
41-
});
42-
43-
it("requestChecksumRequired is set to true", async () => {
44-
const mockConfigWithReqChecksumCalculationWhenRequired = {
45-
...mockConfig,
46-
requestChecksumCalculation: () => Promise.resolve(RequestChecksumCalculation.WHEN_REQUIRED),
47-
};
48-
49-
const handler = flexibleChecksumsInputMiddleware(mockConfigWithReqChecksumCalculationWhenRequired, {
50-
...mockMiddlewareConfigWithRequestAlgorithmMember,
51-
requestChecksumRequired: true,
52-
})(mockNext, {});
53-
54-
await handler({ input: {} });
55-
expect(mockNext).toHaveBeenCalledWith({ input: { [mockRequestAlgorithmMember]: DEFAULT_CHECKSUM_ALGORITHM } });
56-
});
57-
});
58-
});
59-
60-
describe("leaves input.requestAlgorithmMember", () => {
61-
const mockMiddlewareConfigWithRequestAlgorithmMember = {
62-
...mockMiddlewareConfig,
63-
requestAlgorithmMember: mockRequestAlgorithmMember,
64-
};
65-
66-
it("when input[requestAlgorithmMember] is defined", async () => {
67-
const handler = flexibleChecksumsInputMiddleware(mockConfig, mockMiddlewareConfigWithRequestAlgorithmMember)(
68-
mockNext,
69-
{}
70-
);
71-
await handler({ input: { [mockRequestAlgorithmMember]: "SHA256" } });
72-
expect(mockNext).toHaveBeenCalledWith({ input: { [mockRequestAlgorithmMember]: "SHA256" } });
73-
});
74-
75-
it("if requestChecksumCalculation is required and requestChecksumRequired is false", async () => {
76-
const mockConfigReqChecksumCalculationWhenRequired = {
77-
...mockConfig,
78-
requestChecksumCalculation: () => Promise.resolve(RequestChecksumCalculation.WHEN_REQUIRED),
79-
} as PreviouslyResolved;
80-
81-
const handler = flexibleChecksumsInputMiddleware(
82-
mockConfigReqChecksumCalculationWhenRequired,
83-
mockMiddlewareConfigWithRequestAlgorithmMember
84-
)(mockNext, {});
85-
await handler({ input: {} });
86-
expect(mockNext).toHaveBeenCalledWith({ input: {} });
87-
});
88-
});
89-
9027
describe("sets input.requestValidationModeMember", () => {
9128
it("when requestValidationModeMember is defined and responseChecksumValidation is supported", async () => {
9229
const mockMiddlewareConfigWithMockRequestValidationModeMember = {

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,6 @@ export const flexibleChecksumsInputMiddleware =
8080
break;
8181
}
8282

83-
// The value for input member to configure flexible checksum is not set.
84-
if (requestAlgorithmMember && !input[requestAlgorithmMember]) {
85-
// Set requestAlgorithmMember as default checksum algorithm only if request checksum calculation is supported
86-
// or request checksum is required.
87-
if (requestChecksumCalculation === RequestChecksumCalculation.WHEN_SUPPORTED || requestChecksumRequired) {
88-
input[requestAlgorithmMember] = DEFAULT_CHECKSUM_ALGORITHM;
89-
}
90-
}
91-
9283
// The value for input member to opt-in to best-effort validation of a checksum returned in the HTTP response is not set.
9384
if (requestValidationModeMember && !input[requestValidationModeMember]) {
9485
// Set requestValidationModeMember as ENABLED only if response checksum validation is supported.

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

Lines changed: 50 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ describe(flexibleChecksumsMiddleware.name, () => {
2929
const mockChecksum = "mockChecksum";
3030
const mockChecksumAlgorithmFunction = vi.fn();
3131
const mockChecksumLocationName = "mock-checksum-location-name";
32+
const mockRequestAlgorithmMember = "mockRequestAlgorithmMember";
33+
const mockRequestAlgorithmMemberHttpHeader = "mock-request-algorithm-member-http-header";
3234

3335
const mockInput = {};
3436
const mockConfig = {
3537
requestChecksumCalculation: () => Promise.resolve(RequestChecksumCalculation.WHEN_REQUIRED),
3638
} as PreviouslyResolved;
37-
const mockMiddlewareConfig = { requestChecksumRequired: false };
39+
const mockMiddlewareConfig = { input: mockInput, requestChecksumRequired: false };
3840

3941
const mockBody = { body: "mockRequestBody" };
4042
const mockHeaders = { "content-length": 100, "content-encoding": "gzip" };
@@ -78,66 +80,17 @@ describe(flexibleChecksumsMiddleware.name, () => {
7880
expect(getChecksumAlgorithmForRequest).toHaveBeenCalledTimes(1);
7981
});
8082

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, {});
83+
it("skip if header is already present", async () => {
84+
const handler = flexibleChecksumsMiddleware(mockConfig, mockMiddlewareConfig)(mockNext, {});
85+
vi.mocked(hasHeaderWithPrefix).mockReturnValue(true);
9586

96-
await handler(mockArgs);
97-
expect(mockNext).toHaveBeenCalledWith(mockArgs);
98-
});
87+
await handler(mockArgs);
9988

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-
});
89+
expect(hasHeaderWithPrefix).toHaveBeenCalledTimes(1);
90+
expect(getChecksumLocationName).not.toHaveBeenCalled();
91+
expect(selectChecksumAlgorithmFunction).not.toHaveBeenCalled();
92+
expect(hasHeader).not.toHaveBeenCalled();
93+
expect(mockNext).toHaveBeenCalledWith(mockArgs);
14194
});
14295
});
14396
});
@@ -151,6 +104,44 @@ describe(flexibleChecksumsMiddleware.name, () => {
151104
expect(selectChecksumAlgorithmFunction).toHaveBeenCalledTimes(1);
152105
});
153106

107+
describe("if input.requestAlgorithmMember can be set", () => {
108+
describe("input[requestAlgorithmMember] is not defined and", () => {
109+
const mockMwConfigWithReqAlgoMember = {
110+
...mockMiddlewareConfig,
111+
requestAlgorithmMember: mockRequestAlgorithmMember,
112+
requestAlgorithmMemberHttpHeader: mockRequestAlgorithmMemberHttpHeader,
113+
};
114+
115+
it("requestChecksumCalculation is supported", async () => {
116+
const handler = flexibleChecksumsMiddleware(
117+
{
118+
...mockConfig,
119+
requestChecksumCalculation: () => Promise.resolve(RequestChecksumCalculation.WHEN_SUPPORTED),
120+
},
121+
mockMwConfigWithReqAlgoMember
122+
)(mockNext, {});
123+
await handler(mockArgs);
124+
expect(mockNext.mock.calls[0][0].input[mockRequestAlgorithmMember]).toEqual(DEFAULT_CHECKSUM_ALGORITHM);
125+
expect(mockNext.mock.calls[0][0].request.headers[mockRequestAlgorithmMemberHttpHeader]).toEqual(
126+
DEFAULT_CHECKSUM_ALGORITHM
127+
);
128+
});
129+
130+
it("requestChecksumRequired is set to true", async () => {
131+
const handler = flexibleChecksumsMiddleware(mockConfig, {
132+
...mockMwConfigWithReqAlgoMember,
133+
requestChecksumRequired: true,
134+
})(mockNext, {});
135+
136+
await handler(mockArgs);
137+
expect(mockNext.mock.calls[0][0].input[mockRequestAlgorithmMember]).toEqual(DEFAULT_CHECKSUM_ALGORITHM);
138+
expect(mockNext.mock.calls[0][0].request.headers[mockRequestAlgorithmMemberHttpHeader]).toEqual(
139+
DEFAULT_CHECKSUM_ALGORITHM
140+
);
141+
});
142+
});
143+
});
144+
154145
it("for streaming body", async () => {
155146
vi.mocked(isStreaming).mockReturnValue(true);
156147
const mockUpdatedBody = { body: "mockUpdatedBody" };

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

Lines changed: 17 additions & 15 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, DEFAULT_CHECKSUM_ALGORITHM } from "./constants";
14+
import { ChecksumAlgorithm, DEFAULT_CHECKSUM_ALGORITHM, RequestChecksumCalculation } from "./constants";
1515
import { getChecksumAlgorithmForRequest } from "./getChecksumAlgorithmForRequest";
1616
import { getChecksumLocationName } from "./getChecksumLocationName";
1717
import { hasHeader } from "./hasHeader";
@@ -65,26 +65,28 @@ export const flexibleChecksumsMiddleware =
6565
return next(args);
6666
}
6767

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-
}
68+
if (hasHeaderWithPrefix("x-amz-checksum-", args.request.headers)) {
8269
return next(args);
8370
}
8471

72+
const { request, input } = args;
73+
const { body: requestBody, headers } = request;
8574
const { base64Encoder, streamHasher } = config;
75+
const { requestChecksumRequired, requestAlgorithmMember, requestAlgorithmMemberHttpHeader } = middlewareConfig;
8676
const requestChecksumCalculation = await config.requestChecksumCalculation();
8777

78+
// The value for input member to configure flexible checksum is not set.
79+
if (requestAlgorithmMember && !input[requestAlgorithmMember]) {
80+
// Set requestAlgorithmMember as default checksum algorithm only if request checksum calculation is supported
81+
// or request checksum is required.
82+
if (requestChecksumCalculation === RequestChecksumCalculation.WHEN_SUPPORTED || requestChecksumRequired) {
83+
input[requestAlgorithmMember] = DEFAULT_CHECKSUM_ALGORITHM;
84+
if (requestAlgorithmMemberHttpHeader) {
85+
headers[requestAlgorithmMemberHttpHeader] = DEFAULT_CHECKSUM_ALGORITHM;
86+
}
87+
}
88+
}
89+
8890
const checksumAlgorithm = getChecksumAlgorithmForRequest(input, {
8991
requestChecksumRequired,
9092
requestAlgorithmMember: requestAlgorithmMember?.name,

0 commit comments

Comments
 (0)