Skip to content

Commit

Permalink
chore: add flexibleChecksumsInterceptorMiddleware to populate input[r…
Browse files Browse the repository at this point in the history
…equestValidationModeMember]
  • Loading branch information
trivikr committed Sep 18, 2024
1 parent 251a589 commit 0770c7f
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 1 deletion.
7 changes: 6 additions & 1 deletion packages/middleware-flexible-checksums/src/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
StreamHasher,
} from "@smithy/types";

import { RequestChecksumCalculation } from "./constants";
import { RequestChecksumCalculation, ResponseChecksumValidation } from "./constants";

export interface PreviouslyResolved {
/**
Expand Down Expand Up @@ -39,6 +39,11 @@ export interface PreviouslyResolved {
*/
requestChecksumCalculation: Provider<RequestChecksumCalculation>;

/**
* Determines when a checksum will be calculated for response payloads
*/
responseChecksumValidation: Provider<ResponseChecksumValidation>;

/**
* A constructor for a class implementing the {@link Hash} interface that computes SHA1 hashes.
* @internal
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import {
HandlerExecutionContext,
MetadataBearer,
RelativeMiddlewareOptions,
SerializeHandler,
SerializeHandlerArguments,
SerializeHandlerOutput,
SerializeMiddleware,
} from "@smithy/types";

import { PreviouslyResolved } from "./configuration";
import { ResponseChecksumValidation } from "./constants";

export interface FlexibleChecksumsInterceptorMiddlewareConfig {
/**
* Defines a top-level operation input member used to opt-in to best-effort validation
* of a checksum returned in the HTTP response of the operation.
*/
requestValidationModeMember?: string;
}

/**
* @internal
*/
export const flexibleChecksumsInterceptorMiddlewareOptions: RelativeMiddlewareOptions = {
name: "flexibleChecksumsInterceptorMiddleware",
toMiddleware: "serializerMiddleware",
relation: "before",
tags: ["BODY_CHECKSUM"],
override: true,
};

/**
* @internal
*
* The interceptor counterpart to the flexibleChecksumsMiddleware.
*/
export const flexibleChecksumsInterceptorMiddleware =
(
config: PreviouslyResolved,
middlewareConfig: FlexibleChecksumsInterceptorMiddlewareConfig
): SerializeMiddleware<any, any> =>
<Output extends MetadataBearer>(
next: SerializeHandler<any, Output>,
context: HandlerExecutionContext
): SerializeHandler<any, Output> =>
async (args: SerializeHandlerArguments<any>): Promise<SerializeHandlerOutput<Output>> => {
const input = args.input;
const { requestValidationModeMember } = middlewareConfig;
const responseChecksumValidation = await config.responseChecksumValidation();

const isResponseChecksumValidationNeeded =
requestValidationModeMember &&
(input[requestValidationModeMember] === "ENABLED" ||
responseChecksumValidation === ResponseChecksumValidation.WHEN_SUPPORTED);

if (isResponseChecksumValidationNeeded) {
input[requestValidationModeMember] = "ENABLED";
}

return next(args);
};
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { Pluggable } from "@smithy/types";

import { PreviouslyResolved } from "./configuration";
import {
flexibleChecksumsInterceptorMiddleware,
flexibleChecksumsInterceptorMiddlewareOptions,
} from "./flexibleChecksumsInterceptorMiddleware";
import {
flexibleChecksumsMiddleware,
flexibleChecksumsMiddlewareOptions,
Expand All @@ -22,6 +26,10 @@ export const getFlexibleChecksumsPlugin = (
): Pluggable<any, any> => ({
applyToStack: (clientStack) => {
clientStack.add(flexibleChecksumsMiddleware(config, middlewareConfig), flexibleChecksumsMiddlewareOptions);
clientStack.addRelativeTo(
flexibleChecksumsInterceptorMiddleware(config, middlewareConfig),
flexibleChecksumsInterceptorMiddlewareOptions
);
clientStack.addRelativeTo(
flexibleChecksumsResponseMiddleware(config, middlewareConfig),
flexibleChecksumsResponseMiddlewareOptions
Expand Down

0 comments on commit 0770c7f

Please sign in to comment.