@depup/aws-sdk__checksums 3.1000.18-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +32 -0
- package/changes.json +14 -0
- package/crc.d.ts +5 -0
- package/crc.js +5 -0
- package/dist-cjs/index.js +22 -0
- package/dist-cjs/submodules/crc/index.js +159 -0
- package/dist-cjs/submodules/flexible-checksums/index.js +444 -0
- package/dist-cjs/submodules/md5/index.js +4 -0
- package/dist-cjs/submodules/sha/index.js +312 -0
- package/dist-es/index.js +2 -0
- package/dist-es/submodules/crc/crc32c/Crc32cJs.js +31 -0
- package/dist-es/submodules/crc/crc32c/Crc32cNode.js +2 -0
- package/dist-es/submodules/crc/crc64-nvme/Crc64Nvme.js +18 -0
- package/dist-es/submodules/crc/crc64-nvme/Crc64NvmeJs.js +92 -0
- package/dist-es/submodules/crc/crc64-nvme/crc64-nvme-crt-container.js +3 -0
- package/dist-es/submodules/crc/index.browser.js +6 -0
- package/dist-es/submodules/crc/index.js +6 -0
- package/dist-es/submodules/flexible-checksums/NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS.js +9 -0
- package/dist-es/submodules/flexible-checksums/NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS.js +9 -0
- package/dist-es/submodules/flexible-checksums/configuration.js +1 -0
- package/dist-es/submodules/flexible-checksums/constants.js +25 -0
- package/dist-es/submodules/flexible-checksums/flexibleChecksumsInputMiddleware.js +37 -0
- package/dist-es/submodules/flexible-checksums/flexibleChecksumsMiddleware.js +123 -0
- package/dist-es/submodules/flexible-checksums/flexibleChecksumsResponseMiddleware.js +48 -0
- package/dist-es/submodules/flexible-checksums/getChecksum.js +2 -0
- package/dist-es/submodules/flexible-checksums/getChecksumAlgorithmForRequest.js +13 -0
- package/dist-es/submodules/flexible-checksums/getChecksumAlgorithmListForResponse.js +15 -0
- package/dist-es/submodules/flexible-checksums/getChecksumLocationName.js +2 -0
- package/dist-es/submodules/flexible-checksums/getFlexibleChecksumsPlugin.js +10 -0
- package/dist-es/submodules/flexible-checksums/hasHeader.js +9 -0
- package/dist-es/submodules/flexible-checksums/hasHeaderWithPrefix.js +9 -0
- package/dist-es/submodules/flexible-checksums/index.js +6 -0
- package/dist-es/submodules/flexible-checksums/isChecksumWithPartNumber.js +13 -0
- package/dist-es/submodules/flexible-checksums/isStreaming.js +2 -0
- package/dist-es/submodules/flexible-checksums/resolveFlexibleChecksumsConfig.js +11 -0
- package/dist-es/submodules/flexible-checksums/selectChecksumAlgorithmFunction.js +27 -0
- package/dist-es/submodules/flexible-checksums/stringHasher.js +6 -0
- package/dist-es/submodules/flexible-checksums/stringUnionSelector.js +14 -0
- package/dist-es/submodules/flexible-checksums/types.js +15 -0
- package/dist-es/submodules/flexible-checksums/validateChecksumFromResponse.js +45 -0
- package/dist-es/submodules/md5/index.js +1 -0
- package/dist-es/submodules/sha/index.browser.js +4 -0
- package/dist-es/submodules/sha/index.js +4 -0
- package/dist-es/submodules/sha/sha1/Sha1Js.js +173 -0
- package/dist-es/submodules/sha/sha1/Sha1Node.js +59 -0
- package/dist-es/submodules/sha/sha1/Sha1WebCrypto.js +71 -0
- package/dist-types/index.d.ts +3 -0
- package/dist-types/submodules/crc/crc32c/Crc32cJs.d.ts +13 -0
- package/dist-types/submodules/crc/crc32c/Crc32cNode.d.ts +13 -0
- package/dist-types/submodules/crc/crc64-nvme/Crc64Nvme.d.ts +21 -0
- package/dist-types/submodules/crc/crc64-nvme/Crc64NvmeJs.d.ts +14 -0
- package/dist-types/submodules/crc/crc64-nvme/crc64-nvme-crt-container.d.ts +11 -0
- package/dist-types/submodules/crc/index.browser.d.ts +5 -0
- package/dist-types/submodules/crc/index.d.ts +6 -0
- package/dist-types/submodules/flexible-checksums/NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS.d.ts +14 -0
- package/dist-types/submodules/flexible-checksums/NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS.d.ts +14 -0
- package/dist-types/submodules/flexible-checksums/configuration.d.ts +58 -0
- package/dist-types/submodules/flexible-checksums/constants.d.ts +83 -0
- package/dist-types/submodules/flexible-checksums/flexibleChecksumsInputMiddleware.d.ts +22 -0
- package/dist-types/submodules/flexible-checksums/flexibleChecksumsMiddleware.d.ts +33 -0
- package/dist-types/submodules/flexible-checksums/flexibleChecksumsResponseMiddleware.d.ts +27 -0
- package/dist-types/submodules/flexible-checksums/getChecksum.d.ts +6 -0
- package/dist-types/submodules/flexible-checksums/getChecksumAlgorithmForRequest.d.ts +22 -0
- package/dist-types/submodules/flexible-checksums/getChecksumAlgorithmListForResponse.d.ts +6 -0
- package/dist-types/submodules/flexible-checksums/getChecksumLocationName.d.ts +5 -0
- package/dist-types/submodules/flexible-checksums/getFlexibleChecksumsPlugin.d.ts +14 -0
- package/dist-types/submodules/flexible-checksums/hasHeader.d.ts +6 -0
- package/dist-types/submodules/flexible-checksums/hasHeaderWithPrefix.d.ts +6 -0
- package/dist-types/submodules/flexible-checksums/index.d.ts +9 -0
- package/dist-types/submodules/flexible-checksums/isChecksumWithPartNumber.d.ts +1 -0
- package/dist-types/submodules/flexible-checksums/isStreaming.d.ts +4 -0
- package/dist-types/submodules/flexible-checksums/resolveFlexibleChecksumsConfig.d.ts +57 -0
- package/dist-types/submodules/flexible-checksums/selectChecksumAlgorithmFunction.d.ts +7 -0
- package/dist-types/submodules/flexible-checksums/stringHasher.d.ts +5 -0
- package/dist-types/submodules/flexible-checksums/stringUnionSelector.d.ts +12 -0
- package/dist-types/submodules/flexible-checksums/types.d.ts +9 -0
- package/dist-types/submodules/flexible-checksums/validateChecksumFromResponse.d.ts +13 -0
- package/dist-types/submodules/md5/index.d.ts +1 -0
- package/dist-types/submodules/sha/index.browser.d.ts +3 -0
- package/dist-types/submodules/sha/index.d.ts +4 -0
- package/dist-types/submodules/sha/sha1/Sha1Js.d.ts +26 -0
- package/dist-types/submodules/sha/sha1/Sha1Node.d.ts +13 -0
- package/dist-types/submodules/sha/sha1/Sha1WebCrypto.d.ts +22 -0
- package/dist-types/ts3.4/index.d.ts +26 -0
- package/dist-types/ts3.4/submodules/crc/crc32c/Crc32cJs.d.ts +8 -0
- package/dist-types/ts3.4/submodules/crc/crc32c/Crc32cNode.d.ts +5 -0
- package/dist-types/ts3.4/submodules/crc/crc64-nvme/Crc64Nvme.d.ts +8 -0
- package/dist-types/ts3.4/submodules/crc/crc64-nvme/Crc64NvmeJs.d.ts +9 -0
- package/dist-types/ts3.4/submodules/crc/crc64-nvme/crc64-nvme-crt-container.d.ts +4 -0
- package/dist-types/ts3.4/submodules/crc/index.browser.d.ts +5 -0
- package/dist-types/ts3.4/submodules/crc/index.d.ts +6 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS.d.ts +5 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS.d.ts +5 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/configuration.d.ts +26 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/constants.d.ts +27 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/flexibleChecksumsInputMiddleware.d.ts +10 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/flexibleChecksumsMiddleware.d.ts +14 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/flexibleChecksumsResponseMiddleware.d.ts +11 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/getChecksum.d.ts +9 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/getChecksumAlgorithmForRequest.d.ts +15 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/getChecksumAlgorithmListForResponse.d.ts +4 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/getChecksumLocationName.d.ts +2 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/getFlexibleChecksumsPlugin.d.ts +14 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/hasHeader.d.ts +2 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/hasHeaderWithPrefix.d.ts +2 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/index.d.ts +31 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/isChecksumWithPartNumber.d.ts +1 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/isStreaming.d.ts +1 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/resolveFlexibleChecksumsConfig.d.ts +25 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/selectChecksumAlgorithmFunction.d.ts +7 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/stringHasher.d.ts +5 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/stringUnionSelector.d.ts +10 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/types.d.ts +3 -0
- package/dist-types/ts3.4/submodules/flexible-checksums/validateChecksumFromResponse.d.ts +12 -0
- package/dist-types/ts3.4/submodules/md5/index.d.ts +1 -0
- package/dist-types/ts3.4/submodules/sha/index.browser.d.ts +3 -0
- package/dist-types/ts3.4/submodules/sha/index.d.ts +4 -0
- package/dist-types/ts3.4/submodules/sha/sha1/Sha1Js.d.ts +20 -0
- package/dist-types/ts3.4/submodules/sha/sha1/Sha1Node.d.ts +5 -0
- package/dist-types/ts3.4/submodules/sha/sha1/Sha1WebCrypto.d.ts +14 -0
- package/flexible-checksums.d.ts +5 -0
- package/flexible-checksums.js +5 -0
- package/md5.d.ts +5 -0
- package/md5.js +5 -0
- package/package.json +159 -0
- package/sha.d.ts +5 -0
- package/sha.js +5 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
const { setFeature } = require("@aws-sdk/core/client");
|
|
2
|
+
const { HttpRequest } = require("@smithy/core/protocols");
|
|
3
|
+
const { isArrayBuffer, toUint8Array, createBufferedReadable, createChecksumStream } = require("@smithy/core/serde");
|
|
4
|
+
const { Crc64Nvme, Crc32c, Crc32 } = require("@aws-sdk/checksums/crc");
|
|
5
|
+
const { normalizeProvider } = require("@smithy/core/client");
|
|
6
|
+
|
|
7
|
+
const RequestChecksumCalculation = {
|
|
8
|
+
WHEN_SUPPORTED: "WHEN_SUPPORTED",
|
|
9
|
+
WHEN_REQUIRED: "WHEN_REQUIRED",
|
|
10
|
+
};
|
|
11
|
+
const DEFAULT_REQUEST_CHECKSUM_CALCULATION = RequestChecksumCalculation.WHEN_SUPPORTED;
|
|
12
|
+
const ResponseChecksumValidation = {
|
|
13
|
+
WHEN_SUPPORTED: "WHEN_SUPPORTED",
|
|
14
|
+
WHEN_REQUIRED: "WHEN_REQUIRED",
|
|
15
|
+
};
|
|
16
|
+
const DEFAULT_RESPONSE_CHECKSUM_VALIDATION = RequestChecksumCalculation.WHEN_SUPPORTED;
|
|
17
|
+
var ChecksumAlgorithm;
|
|
18
|
+
(function (ChecksumAlgorithm) {
|
|
19
|
+
ChecksumAlgorithm["MD5"] = "MD5";
|
|
20
|
+
ChecksumAlgorithm["CRC32"] = "CRC32";
|
|
21
|
+
ChecksumAlgorithm["CRC32C"] = "CRC32C";
|
|
22
|
+
ChecksumAlgorithm["CRC64NVME"] = "CRC64NVME";
|
|
23
|
+
ChecksumAlgorithm["SHA1"] = "SHA1";
|
|
24
|
+
ChecksumAlgorithm["SHA256"] = "SHA256";
|
|
25
|
+
})(ChecksumAlgorithm || (ChecksumAlgorithm = {}));
|
|
26
|
+
var ChecksumLocation;
|
|
27
|
+
(function (ChecksumLocation) {
|
|
28
|
+
ChecksumLocation["HEADER"] = "header";
|
|
29
|
+
ChecksumLocation["TRAILER"] = "trailer";
|
|
30
|
+
})(ChecksumLocation || (ChecksumLocation = {}));
|
|
31
|
+
const DEFAULT_CHECKSUM_ALGORITHM = ChecksumAlgorithm.CRC32;
|
|
32
|
+
|
|
33
|
+
var SelectorType;
|
|
34
|
+
(function (SelectorType) {
|
|
35
|
+
SelectorType["ENV"] = "env";
|
|
36
|
+
SelectorType["CONFIG"] = "shared config entry";
|
|
37
|
+
})(SelectorType || (SelectorType = {}));
|
|
38
|
+
const stringUnionSelector = (obj, key, union, type) => {
|
|
39
|
+
if (!(key in obj))
|
|
40
|
+
return undefined;
|
|
41
|
+
const value = obj[key].toUpperCase();
|
|
42
|
+
if (!Object.values(union).includes(value)) {
|
|
43
|
+
throw new TypeError(`Cannot load ${type} '${key}'. Expected one of ${Object.values(union)}, got '${obj[key]}'.`);
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const ENV_REQUEST_CHECKSUM_CALCULATION = "AWS_REQUEST_CHECKSUM_CALCULATION";
|
|
49
|
+
const CONFIG_REQUEST_CHECKSUM_CALCULATION = "request_checksum_calculation";
|
|
50
|
+
const NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS = {
|
|
51
|
+
environmentVariableSelector: (env) => stringUnionSelector(env, ENV_REQUEST_CHECKSUM_CALCULATION, RequestChecksumCalculation, SelectorType.ENV),
|
|
52
|
+
configFileSelector: (profile) => stringUnionSelector(profile, CONFIG_REQUEST_CHECKSUM_CALCULATION, RequestChecksumCalculation, SelectorType.CONFIG),
|
|
53
|
+
default: DEFAULT_REQUEST_CHECKSUM_CALCULATION,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const ENV_RESPONSE_CHECKSUM_VALIDATION = "AWS_RESPONSE_CHECKSUM_VALIDATION";
|
|
57
|
+
const CONFIG_RESPONSE_CHECKSUM_VALIDATION = "response_checksum_validation";
|
|
58
|
+
const NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS = {
|
|
59
|
+
environmentVariableSelector: (env) => stringUnionSelector(env, ENV_RESPONSE_CHECKSUM_VALIDATION, ResponseChecksumValidation, SelectorType.ENV),
|
|
60
|
+
configFileSelector: (profile) => stringUnionSelector(profile, CONFIG_RESPONSE_CHECKSUM_VALIDATION, ResponseChecksumValidation, SelectorType.CONFIG),
|
|
61
|
+
default: DEFAULT_RESPONSE_CHECKSUM_VALIDATION,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const getChecksumAlgorithmForRequest = (input, { requestChecksumRequired, requestAlgorithmMember, requestChecksumCalculation }) => {
|
|
65
|
+
if (!requestAlgorithmMember) {
|
|
66
|
+
return requestChecksumCalculation === RequestChecksumCalculation.WHEN_SUPPORTED || requestChecksumRequired
|
|
67
|
+
? DEFAULT_CHECKSUM_ALGORITHM
|
|
68
|
+
: undefined;
|
|
69
|
+
}
|
|
70
|
+
if (!input[requestAlgorithmMember]) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
const checksumAlgorithm = input[requestAlgorithmMember];
|
|
74
|
+
return checksumAlgorithm;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const getChecksumLocationName = (algorithm) => algorithm === ChecksumAlgorithm.MD5 ? "content-md5" : `x-amz-checksum-${algorithm.toLowerCase()}`;
|
|
78
|
+
|
|
79
|
+
const hasHeader = (header, headers) => {
|
|
80
|
+
const soughtHeader = header.toLowerCase();
|
|
81
|
+
for (const headerName of Object.keys(headers)) {
|
|
82
|
+
if (soughtHeader === headerName.toLowerCase()) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const hasHeaderWithPrefix = (headerPrefix, headers) => {
|
|
90
|
+
const soughtHeaderPrefix = headerPrefix.toLowerCase();
|
|
91
|
+
for (const headerName of Object.keys(headers)) {
|
|
92
|
+
if (headerName.toLowerCase().startsWith(soughtHeaderPrefix)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const isStreaming = (body) => body !== undefined && typeof body !== "string" && !ArrayBuffer.isView(body) && !isArrayBuffer(body);
|
|
100
|
+
|
|
101
|
+
const CLIENT_SUPPORTED_ALGORITHMS = [
|
|
102
|
+
ChecksumAlgorithm.CRC32,
|
|
103
|
+
ChecksumAlgorithm.CRC32C,
|
|
104
|
+
ChecksumAlgorithm.CRC64NVME,
|
|
105
|
+
ChecksumAlgorithm.SHA1,
|
|
106
|
+
ChecksumAlgorithm.SHA256,
|
|
107
|
+
];
|
|
108
|
+
const PRIORITY_ORDER_ALGORITHMS = [
|
|
109
|
+
ChecksumAlgorithm.SHA256,
|
|
110
|
+
ChecksumAlgorithm.SHA1,
|
|
111
|
+
ChecksumAlgorithm.CRC32,
|
|
112
|
+
ChecksumAlgorithm.CRC32C,
|
|
113
|
+
ChecksumAlgorithm.CRC64NVME,
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
const selectChecksumAlgorithmFunction = (checksumAlgorithm, config) => {
|
|
117
|
+
const { checksumAlgorithms = {} } = config;
|
|
118
|
+
switch (checksumAlgorithm) {
|
|
119
|
+
case ChecksumAlgorithm.MD5:
|
|
120
|
+
return checksumAlgorithms?.MD5 ?? config.md5;
|
|
121
|
+
case ChecksumAlgorithm.CRC32:
|
|
122
|
+
return checksumAlgorithms?.CRC32 ?? Crc32;
|
|
123
|
+
case ChecksumAlgorithm.CRC32C:
|
|
124
|
+
return checksumAlgorithms?.CRC32C ?? Crc32c;
|
|
125
|
+
case ChecksumAlgorithm.CRC64NVME:
|
|
126
|
+
return checksumAlgorithms?.CRC64NVME ?? Crc64Nvme;
|
|
127
|
+
case ChecksumAlgorithm.SHA1:
|
|
128
|
+
return checksumAlgorithms?.SHA1 ?? config.sha1;
|
|
129
|
+
case ChecksumAlgorithm.SHA256:
|
|
130
|
+
return checksumAlgorithms?.SHA256 ?? config.sha256;
|
|
131
|
+
default:
|
|
132
|
+
if (checksumAlgorithms?.[checksumAlgorithm]) {
|
|
133
|
+
return checksumAlgorithms[checksumAlgorithm];
|
|
134
|
+
}
|
|
135
|
+
throw new Error(`The checksum algorithm "${checksumAlgorithm}" is not supported by the client.` +
|
|
136
|
+
` Select one of ${CLIENT_SUPPORTED_ALGORITHMS}, or provide an implementation to ` +
|
|
137
|
+
` the client constructor checksums field.`);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const stringHasher = (checksumAlgorithmFn, body) => {
|
|
142
|
+
const hash = new checksumAlgorithmFn();
|
|
143
|
+
hash.update(toUint8Array(body || ""));
|
|
144
|
+
return hash.digest();
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const flexibleChecksumsMiddlewareOptions = {
|
|
148
|
+
name: "flexibleChecksumsMiddleware",
|
|
149
|
+
step: "build",
|
|
150
|
+
tags: ["BODY_CHECKSUM"],
|
|
151
|
+
override: true,
|
|
152
|
+
};
|
|
153
|
+
const flexibleChecksumsMiddleware = (config, middlewareConfig) => (next, context) => async (args) => {
|
|
154
|
+
if (!HttpRequest.isInstance(args.request)) {
|
|
155
|
+
return next(args);
|
|
156
|
+
}
|
|
157
|
+
if (hasHeaderWithPrefix("x-amz-checksum-", args.request.headers)) {
|
|
158
|
+
return next(args);
|
|
159
|
+
}
|
|
160
|
+
const { request, input } = args;
|
|
161
|
+
const { body: requestBody, headers } = request;
|
|
162
|
+
const { base64Encoder, streamHasher } = config;
|
|
163
|
+
const { requestChecksumRequired, requestAlgorithmMember } = middlewareConfig;
|
|
164
|
+
const requestChecksumCalculation = await config.requestChecksumCalculation();
|
|
165
|
+
const requestAlgorithmMemberName = requestAlgorithmMember?.name;
|
|
166
|
+
const requestAlgorithmMemberHttpHeader = requestAlgorithmMember?.httpHeader;
|
|
167
|
+
if (requestAlgorithmMemberName && !input[requestAlgorithmMemberName]) {
|
|
168
|
+
if (requestChecksumCalculation === RequestChecksumCalculation.WHEN_SUPPORTED || requestChecksumRequired) {
|
|
169
|
+
input[requestAlgorithmMemberName] = DEFAULT_CHECKSUM_ALGORITHM;
|
|
170
|
+
if (requestAlgorithmMemberHttpHeader) {
|
|
171
|
+
headers[requestAlgorithmMemberHttpHeader] = DEFAULT_CHECKSUM_ALGORITHM;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const checksumAlgorithm = getChecksumAlgorithmForRequest(input, {
|
|
176
|
+
requestChecksumRequired,
|
|
177
|
+
requestAlgorithmMember: requestAlgorithmMember?.name,
|
|
178
|
+
requestChecksumCalculation,
|
|
179
|
+
});
|
|
180
|
+
let updatedBody = requestBody;
|
|
181
|
+
let updatedHeaders = headers;
|
|
182
|
+
if (checksumAlgorithm) {
|
|
183
|
+
switch (checksumAlgorithm) {
|
|
184
|
+
case ChecksumAlgorithm.CRC32:
|
|
185
|
+
setFeature(context, "FLEXIBLE_CHECKSUMS_REQ_CRC32", "U");
|
|
186
|
+
break;
|
|
187
|
+
case ChecksumAlgorithm.CRC32C:
|
|
188
|
+
setFeature(context, "FLEXIBLE_CHECKSUMS_REQ_CRC32C", "V");
|
|
189
|
+
break;
|
|
190
|
+
case ChecksumAlgorithm.CRC64NVME:
|
|
191
|
+
setFeature(context, "FLEXIBLE_CHECKSUMS_REQ_CRC64", "W");
|
|
192
|
+
break;
|
|
193
|
+
case ChecksumAlgorithm.SHA1:
|
|
194
|
+
setFeature(context, "FLEXIBLE_CHECKSUMS_REQ_SHA1", "X");
|
|
195
|
+
break;
|
|
196
|
+
case ChecksumAlgorithm.SHA256:
|
|
197
|
+
setFeature(context, "FLEXIBLE_CHECKSUMS_REQ_SHA256", "Y");
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
const checksumLocationName = getChecksumLocationName(checksumAlgorithm);
|
|
201
|
+
const checksumAlgorithmFn = selectChecksumAlgorithmFunction(checksumAlgorithm, config);
|
|
202
|
+
if (isStreaming(requestBody)) {
|
|
203
|
+
const { getAwsChunkedEncodingStream, bodyLengthChecker } = config;
|
|
204
|
+
updatedBody = getAwsChunkedEncodingStream(typeof config.requestStreamBufferSize === "number" && config.requestStreamBufferSize >= 8 * 1024
|
|
205
|
+
? createBufferedReadable(requestBody, config.requestStreamBufferSize, context.logger)
|
|
206
|
+
: requestBody, {
|
|
207
|
+
base64Encoder,
|
|
208
|
+
bodyLengthChecker,
|
|
209
|
+
checksumLocationName,
|
|
210
|
+
checksumAlgorithmFn,
|
|
211
|
+
streamHasher,
|
|
212
|
+
});
|
|
213
|
+
updatedHeaders = {
|
|
214
|
+
...headers,
|
|
215
|
+
"content-encoding": headers["content-encoding"]
|
|
216
|
+
? `${headers["content-encoding"]},aws-chunked`
|
|
217
|
+
: "aws-chunked",
|
|
218
|
+
"transfer-encoding": "chunked",
|
|
219
|
+
"x-amz-decoded-content-length": headers["content-length"],
|
|
220
|
+
"x-amz-content-sha256": "STREAMING-UNSIGNED-PAYLOAD-TRAILER",
|
|
221
|
+
"x-amz-trailer": checksumLocationName,
|
|
222
|
+
};
|
|
223
|
+
delete updatedHeaders["content-length"];
|
|
224
|
+
}
|
|
225
|
+
else if (!hasHeader(checksumLocationName, headers)) {
|
|
226
|
+
const rawChecksum = await stringHasher(checksumAlgorithmFn, requestBody);
|
|
227
|
+
updatedHeaders = {
|
|
228
|
+
...headers,
|
|
229
|
+
[checksumLocationName]: base64Encoder(rawChecksum),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
const result = await next({
|
|
235
|
+
...args,
|
|
236
|
+
request: {
|
|
237
|
+
...request,
|
|
238
|
+
headers: updatedHeaders,
|
|
239
|
+
body: updatedBody,
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
if (e instanceof Error && e.name === "InvalidChunkSizeError") {
|
|
246
|
+
try {
|
|
247
|
+
if (!e.message.endsWith(".")) {
|
|
248
|
+
e.message += ".";
|
|
249
|
+
}
|
|
250
|
+
e.message +=
|
|
251
|
+
" Set [requestStreamBufferSize=number e.g. 65_536] in client constructor to instruct AWS SDK to buffer your input stream.";
|
|
252
|
+
}
|
|
253
|
+
catch (ignored) {
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
throw e;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
const flexibleChecksumsInputMiddlewareOptions = {
|
|
261
|
+
name: "flexibleChecksumsInputMiddleware",
|
|
262
|
+
toMiddleware: "serializerMiddleware",
|
|
263
|
+
relation: "before",
|
|
264
|
+
tags: ["BODY_CHECKSUM"],
|
|
265
|
+
override: true,
|
|
266
|
+
};
|
|
267
|
+
const flexibleChecksumsInputMiddleware = (config, middlewareConfig) => (next, context) => async (args) => {
|
|
268
|
+
const input = args.input;
|
|
269
|
+
const { requestValidationModeMember } = middlewareConfig;
|
|
270
|
+
const requestChecksumCalculation = await config.requestChecksumCalculation();
|
|
271
|
+
const responseChecksumValidation = await config.responseChecksumValidation();
|
|
272
|
+
switch (requestChecksumCalculation) {
|
|
273
|
+
case RequestChecksumCalculation.WHEN_REQUIRED:
|
|
274
|
+
setFeature(context, "FLEXIBLE_CHECKSUMS_REQ_WHEN_REQUIRED", "a");
|
|
275
|
+
break;
|
|
276
|
+
case RequestChecksumCalculation.WHEN_SUPPORTED:
|
|
277
|
+
setFeature(context, "FLEXIBLE_CHECKSUMS_REQ_WHEN_SUPPORTED", "Z");
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
switch (responseChecksumValidation) {
|
|
281
|
+
case ResponseChecksumValidation.WHEN_REQUIRED:
|
|
282
|
+
setFeature(context, "FLEXIBLE_CHECKSUMS_RES_WHEN_REQUIRED", "c");
|
|
283
|
+
break;
|
|
284
|
+
case ResponseChecksumValidation.WHEN_SUPPORTED:
|
|
285
|
+
setFeature(context, "FLEXIBLE_CHECKSUMS_RES_WHEN_SUPPORTED", "b");
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
if (requestValidationModeMember && !input[requestValidationModeMember]) {
|
|
289
|
+
if (responseChecksumValidation === ResponseChecksumValidation.WHEN_SUPPORTED) {
|
|
290
|
+
input[requestValidationModeMember] = "ENABLED";
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return next(args);
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
const getChecksumAlgorithmListForResponse = (responseAlgorithms = []) => {
|
|
297
|
+
const validChecksumAlgorithms = [];
|
|
298
|
+
let i = PRIORITY_ORDER_ALGORITHMS.length;
|
|
299
|
+
for (const algorithm of responseAlgorithms) {
|
|
300
|
+
const priority = PRIORITY_ORDER_ALGORITHMS.indexOf(algorithm);
|
|
301
|
+
if (priority !== -1) {
|
|
302
|
+
validChecksumAlgorithms[priority] = algorithm;
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
validChecksumAlgorithms[i++] = algorithm;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return validChecksumAlgorithms.filter(Boolean);
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
const isChecksumWithPartNumber = (checksum) => {
|
|
312
|
+
const lastHyphenIndex = checksum.lastIndexOf("-");
|
|
313
|
+
if (lastHyphenIndex !== -1) {
|
|
314
|
+
const numberPart = checksum.slice(lastHyphenIndex + 1);
|
|
315
|
+
if (!numberPart.startsWith("0")) {
|
|
316
|
+
const number = parseInt(numberPart, 10);
|
|
317
|
+
if (!isNaN(number) && number >= 1 && number <= 10000) {
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return false;
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
const getChecksum = async (body, { checksumAlgorithmFn, base64Encoder }) => base64Encoder(await stringHasher(checksumAlgorithmFn, body));
|
|
326
|
+
|
|
327
|
+
const validateChecksumFromResponse = async (response, { config, responseAlgorithms, logger }) => {
|
|
328
|
+
const checksumAlgorithms = getChecksumAlgorithmListForResponse(responseAlgorithms);
|
|
329
|
+
const { body: responseBody, headers: responseHeaders } = response;
|
|
330
|
+
for (const algorithm of checksumAlgorithms) {
|
|
331
|
+
const responseHeader = getChecksumLocationName(algorithm);
|
|
332
|
+
const checksumFromResponse = responseHeaders[responseHeader];
|
|
333
|
+
if (checksumFromResponse) {
|
|
334
|
+
let checksumAlgorithmFn;
|
|
335
|
+
try {
|
|
336
|
+
checksumAlgorithmFn = selectChecksumAlgorithmFunction(algorithm, config);
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
if (algorithm === ChecksumAlgorithm.CRC64NVME) {
|
|
340
|
+
logger?.warn(`Skipping ${ChecksumAlgorithm.CRC64NVME} checksum validation: ${error.message}`);
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
throw error;
|
|
344
|
+
}
|
|
345
|
+
const { base64Encoder } = config;
|
|
346
|
+
if (isStreaming(responseBody)) {
|
|
347
|
+
response.body = createChecksumStream({
|
|
348
|
+
expectedChecksum: checksumFromResponse,
|
|
349
|
+
checksumSourceLocation: responseHeader,
|
|
350
|
+
checksum: new checksumAlgorithmFn(),
|
|
351
|
+
source: responseBody,
|
|
352
|
+
base64Encoder,
|
|
353
|
+
});
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const checksum = await getChecksum(responseBody, { checksumAlgorithmFn, base64Encoder });
|
|
357
|
+
if (checksum === checksumFromResponse) {
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
throw new Error(`Checksum mismatch: expected "${checksum}" but received "${checksumFromResponse}"` +
|
|
361
|
+
` in response header "${responseHeader}".`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
const flexibleChecksumsResponseMiddlewareOptions = {
|
|
367
|
+
name: "flexibleChecksumsResponseMiddleware",
|
|
368
|
+
toMiddleware: "deserializerMiddleware",
|
|
369
|
+
relation: "after",
|
|
370
|
+
tags: ["BODY_CHECKSUM"],
|
|
371
|
+
override: true,
|
|
372
|
+
};
|
|
373
|
+
const flexibleChecksumsResponseMiddleware = (config, middlewareConfig) => (next, context) => async (args) => {
|
|
374
|
+
if (!HttpRequest.isInstance(args.request)) {
|
|
375
|
+
return next(args);
|
|
376
|
+
}
|
|
377
|
+
const input = args.input;
|
|
378
|
+
const result = await next(args);
|
|
379
|
+
const response = result.response;
|
|
380
|
+
const { requestValidationModeMember, responseAlgorithms } = middlewareConfig;
|
|
381
|
+
if (requestValidationModeMember && input[requestValidationModeMember] === "ENABLED") {
|
|
382
|
+
const { clientName, commandName } = context;
|
|
383
|
+
const customChecksumAlgorithms = Object.keys(config.checksumAlgorithms ?? {}).filter((algorithm) => {
|
|
384
|
+
const responseHeader = getChecksumLocationName(algorithm);
|
|
385
|
+
return response.headers[responseHeader] !== undefined;
|
|
386
|
+
});
|
|
387
|
+
const algoList = getChecksumAlgorithmListForResponse([
|
|
388
|
+
...(responseAlgorithms ?? []),
|
|
389
|
+
...customChecksumAlgorithms,
|
|
390
|
+
]);
|
|
391
|
+
const isS3WholeObjectMultipartGetResponseChecksum = clientName === "S3Client" &&
|
|
392
|
+
commandName === "GetObjectCommand" &&
|
|
393
|
+
algoList.every((algorithm) => {
|
|
394
|
+
const responseHeader = getChecksumLocationName(algorithm);
|
|
395
|
+
const checksumFromResponse = response.headers[responseHeader];
|
|
396
|
+
return !checksumFromResponse || isChecksumWithPartNumber(checksumFromResponse);
|
|
397
|
+
});
|
|
398
|
+
if (isS3WholeObjectMultipartGetResponseChecksum) {
|
|
399
|
+
return result;
|
|
400
|
+
}
|
|
401
|
+
await validateChecksumFromResponse(response, {
|
|
402
|
+
config,
|
|
403
|
+
responseAlgorithms: algoList,
|
|
404
|
+
logger: context.logger,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
return result;
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
const getFlexibleChecksumsPlugin = (config, middlewareConfig) => ({
|
|
411
|
+
applyToStack: (clientStack) => {
|
|
412
|
+
clientStack.add(flexibleChecksumsMiddleware(config, middlewareConfig), flexibleChecksumsMiddlewareOptions);
|
|
413
|
+
clientStack.addRelativeTo(flexibleChecksumsInputMiddleware(config, middlewareConfig), flexibleChecksumsInputMiddlewareOptions);
|
|
414
|
+
clientStack.addRelativeTo(flexibleChecksumsResponseMiddleware(config, middlewareConfig), flexibleChecksumsResponseMiddlewareOptions);
|
|
415
|
+
},
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
const resolveFlexibleChecksumsConfig = (input) => {
|
|
419
|
+
const { requestChecksumCalculation, responseChecksumValidation, requestStreamBufferSize } = input;
|
|
420
|
+
return Object.assign(input, {
|
|
421
|
+
requestChecksumCalculation: normalizeProvider(requestChecksumCalculation ?? DEFAULT_REQUEST_CHECKSUM_CALCULATION),
|
|
422
|
+
responseChecksumValidation: normalizeProvider(responseChecksumValidation ?? DEFAULT_RESPONSE_CHECKSUM_VALIDATION),
|
|
423
|
+
requestStreamBufferSize: Number(requestStreamBufferSize ?? 0),
|
|
424
|
+
checksumAlgorithms: input.checksumAlgorithms ?? {},
|
|
425
|
+
});
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
exports.CONFIG_REQUEST_CHECKSUM_CALCULATION = CONFIG_REQUEST_CHECKSUM_CALCULATION;
|
|
429
|
+
exports.CONFIG_RESPONSE_CHECKSUM_VALIDATION = CONFIG_RESPONSE_CHECKSUM_VALIDATION;
|
|
430
|
+
exports.ChecksumAlgorithm = ChecksumAlgorithm;
|
|
431
|
+
exports.ChecksumLocation = ChecksumLocation;
|
|
432
|
+
exports.DEFAULT_CHECKSUM_ALGORITHM = DEFAULT_CHECKSUM_ALGORITHM;
|
|
433
|
+
exports.DEFAULT_REQUEST_CHECKSUM_CALCULATION = DEFAULT_REQUEST_CHECKSUM_CALCULATION;
|
|
434
|
+
exports.DEFAULT_RESPONSE_CHECKSUM_VALIDATION = DEFAULT_RESPONSE_CHECKSUM_VALIDATION;
|
|
435
|
+
exports.ENV_REQUEST_CHECKSUM_CALCULATION = ENV_REQUEST_CHECKSUM_CALCULATION;
|
|
436
|
+
exports.ENV_RESPONSE_CHECKSUM_VALIDATION = ENV_RESPONSE_CHECKSUM_VALIDATION;
|
|
437
|
+
exports.NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS = NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS;
|
|
438
|
+
exports.NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS = NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS;
|
|
439
|
+
exports.RequestChecksumCalculation = RequestChecksumCalculation;
|
|
440
|
+
exports.ResponseChecksumValidation = ResponseChecksumValidation;
|
|
441
|
+
exports.flexibleChecksumsMiddleware = flexibleChecksumsMiddleware;
|
|
442
|
+
exports.flexibleChecksumsMiddlewareOptions = flexibleChecksumsMiddlewareOptions;
|
|
443
|
+
exports.getFlexibleChecksumsPlugin = getFlexibleChecksumsPlugin;
|
|
444
|
+
exports.resolveFlexibleChecksumsConfig = resolveFlexibleChecksumsConfig;
|