41 lines
1.9 KiB
JavaScript
41 lines
1.9 KiB
JavaScript
import { HttpRequest } from "@smithy/protocol-http";
|
|
import { getChecksumAlgorithmListForResponse } from "./getChecksumAlgorithmListForResponse";
|
|
import { getChecksumLocationName } from "./getChecksumLocationName";
|
|
import { isChecksumWithPartNumber } from "./isChecksumWithPartNumber";
|
|
import { validateChecksumFromResponse } from "./validateChecksumFromResponse";
|
|
export const flexibleChecksumsResponseMiddlewareOptions = {
|
|
name: "flexibleChecksumsResponseMiddleware",
|
|
toMiddleware: "deserializerMiddleware",
|
|
relation: "after",
|
|
tags: ["BODY_CHECKSUM"],
|
|
override: true,
|
|
};
|
|
export const flexibleChecksumsResponseMiddleware = (config, middlewareConfig) => (next, context) => async (args) => {
|
|
if (!HttpRequest.isInstance(args.request)) {
|
|
return next(args);
|
|
}
|
|
const input = args.input;
|
|
const result = await next(args);
|
|
const response = result.response;
|
|
const { requestValidationModeMember, responseAlgorithms } = middlewareConfig;
|
|
if (requestValidationModeMember && input[requestValidationModeMember] === "ENABLED") {
|
|
const { clientName, commandName } = context;
|
|
const isS3WholeObjectMultipartGetResponseChecksum = clientName === "S3Client" &&
|
|
commandName === "GetObjectCommand" &&
|
|
getChecksumAlgorithmListForResponse(responseAlgorithms).every((algorithm) => {
|
|
const responseHeader = getChecksumLocationName(algorithm);
|
|
const checksumFromResponse = response.headers[responseHeader];
|
|
return !checksumFromResponse || isChecksumWithPartNumber(checksumFromResponse);
|
|
});
|
|
if (isS3WholeObjectMultipartGetResponseChecksum) {
|
|
return result;
|
|
}
|
|
await validateChecksumFromResponse(response, {
|
|
config,
|
|
responseAlgorithms,
|
|
logger: context.logger,
|
|
});
|
|
}
|
|
return result;
|
|
};
|