70 lines
2.8 KiB
JavaScript
70 lines
2.8 KiB
JavaScript
|
|
import { HttpRequest } from "@smithy/protocol-http";
|
||
|
|
import { getChecksumAlgorithmForRequest } from "./getChecksumAlgorithmForRequest";
|
||
|
|
import { getChecksumLocationName } from "./getChecksumLocationName";
|
||
|
|
import { hasHeader } from "./hasHeader";
|
||
|
|
import { isStreaming } from "./isStreaming";
|
||
|
|
import { selectChecksumAlgorithmFunction } from "./selectChecksumAlgorithmFunction";
|
||
|
|
import { stringHasher } from "./stringHasher";
|
||
|
|
export const flexibleChecksumsMiddlewareOptions = {
|
||
|
|
name: "flexibleChecksumsMiddleware",
|
||
|
|
step: "build",
|
||
|
|
tags: ["BODY_CHECKSUM"],
|
||
|
|
override: true,
|
||
|
|
};
|
||
|
|
export const flexibleChecksumsMiddleware = (config, middlewareConfig) => (next, context) => async (args) => {
|
||
|
|
if (!HttpRequest.isInstance(args.request)) {
|
||
|
|
return next(args);
|
||
|
|
}
|
||
|
|
const { request } = args;
|
||
|
|
const { body: requestBody, headers } = request;
|
||
|
|
const { base64Encoder, streamHasher } = config;
|
||
|
|
const { input, requestChecksumRequired, requestAlgorithmMember } = middlewareConfig;
|
||
|
|
const checksumAlgorithm = getChecksumAlgorithmForRequest(input, {
|
||
|
|
requestChecksumRequired,
|
||
|
|
requestAlgorithmMember,
|
||
|
|
}, !!context.isS3ExpressBucket);
|
||
|
|
let updatedBody = requestBody;
|
||
|
|
let updatedHeaders = headers;
|
||
|
|
if (checksumAlgorithm) {
|
||
|
|
const checksumLocationName = getChecksumLocationName(checksumAlgorithm);
|
||
|
|
const checksumAlgorithmFn = selectChecksumAlgorithmFunction(checksumAlgorithm, config);
|
||
|
|
if (isStreaming(requestBody)) {
|
||
|
|
const { getAwsChunkedEncodingStream, bodyLengthChecker } = config;
|
||
|
|
updatedBody = getAwsChunkedEncodingStream(requestBody, {
|
||
|
|
base64Encoder,
|
||
|
|
bodyLengthChecker,
|
||
|
|
checksumLocationName,
|
||
|
|
checksumAlgorithmFn,
|
||
|
|
streamHasher,
|
||
|
|
});
|
||
|
|
updatedHeaders = {
|
||
|
|
...headers,
|
||
|
|
"content-encoding": headers["content-encoding"]
|
||
|
|
? `${headers["content-encoding"]},aws-chunked`
|
||
|
|
: "aws-chunked",
|
||
|
|
"transfer-encoding": "chunked",
|
||
|
|
"x-amz-decoded-content-length": headers["content-length"],
|
||
|
|
"x-amz-content-sha256": "STREAMING-UNSIGNED-PAYLOAD-TRAILER",
|
||
|
|
"x-amz-trailer": checksumLocationName,
|
||
|
|
};
|
||
|
|
delete updatedHeaders["content-length"];
|
||
|
|
}
|
||
|
|
else if (!hasHeader(checksumLocationName, headers)) {
|
||
|
|
const rawChecksum = await stringHasher(checksumAlgorithmFn, requestBody);
|
||
|
|
updatedHeaders = {
|
||
|
|
...headers,
|
||
|
|
[checksumLocationName]: base64Encoder(rawChecksum),
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
const result = await next({
|
||
|
|
...args,
|
||
|
|
request: {
|
||
|
|
...request,
|
||
|
|
headers: updatedHeaders,
|
||
|
|
body: updatedBody,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
return result;
|
||
|
|
};
|