From e63bab37f915189c88271a89bebde887f4146c5a Mon Sep 17 00:00:00 2001 From: George Fu Date: Fri, 14 Nov 2025 11:59:07 -0500 Subject: [PATCH] fix(core/protocols): decorate service exceptions with unmodeled fields --- clients/client-s3/test/e2e/S3.e2e.spec.ts | 16 +++++- .../src/submodules/protocols/ProtocolLib.ts | 32 +++++++++-- .../cbor/AwsSmithyRpcV2CborProtocol.spec.ts | 50 +++++++++++++---- .../cbor/AwsSmithyRpcV2CborProtocol.ts | 22 ++++---- .../protocols/json/AwsJson1_1Protocol.spec.ts | 36 +++++++++++++ .../protocols/json/AwsJsonRpcProtocol.spec.ts | 12 +---- .../protocols/json/AwsJsonRpcProtocol.ts | 25 +++++---- .../json/AwsRestJsonProtocol.spec.ts | 35 ++++++++++++ .../protocols/json/AwsRestJsonProtocol.ts | 19 ++++--- .../protocols/query/AwsQueryProtocol.spec.ts | 44 +++++++++++++++ .../protocols/query/AwsQueryProtocol.ts | 22 +++++--- .../submodules/protocols/test-schema.spec.ts | 2 + .../protocols/xml/AwsRestXmlProtocol.spec.ts | 37 +++++++++++++ .../protocols/xml/AwsRestXmlProtocol.ts | 22 +++++--- scripts/validation/api.json | 53 ------------------- 15 files changed, 307 insertions(+), 120 deletions(-) create mode 100644 packages/core/src/submodules/protocols/query/AwsQueryProtocol.spec.ts diff --git a/clients/client-s3/test/e2e/S3.e2e.spec.ts b/clients/client-s3/test/e2e/S3.e2e.spec.ts index abebb1bb74f9c..c83cd331dc9a6 100644 --- a/clients/client-s3/test/e2e/S3.e2e.spec.ts +++ b/clients/client-s3/test/e2e/S3.e2e.spec.ts @@ -1,10 +1,10 @@ import "@aws-sdk/signature-v4-crt"; +import { getE2eTestResources } from "@aws-sdk/aws-util-test/src"; import { ChecksumAlgorithm, S3 } from "@aws-sdk/client-s3"; import { afterAll, afterEach, beforeAll, describe, expect, test as it } from "vitest"; import { createBuffer } from "./helpers"; -import { getE2eTestResources } from "@aws-sdk/aws-util-test/src"; let Key = `${Date.now()}`; @@ -246,5 +246,19 @@ describe("@aws-sdk/client-s3", () => { expect(result.$metadata.httpStatusCode).toEqual(200); expect(result.Contents).toBeInstanceOf(Array); }); + + describe("error handling", () => { + it("should decorate exceptions with unmodeled error fields", async () => { + const error = await client + .abortMultipartUpload({ + Bucket, + Key: "nonexistent-key", + UploadId: "uploadId", + }) + .catch((e) => e); + + expect((error as any).UploadId).toEqual("uploadId"); + }); + }); }); }, 60_000); diff --git a/packages/core/src/submodules/protocols/ProtocolLib.ts b/packages/core/src/submodules/protocols/ProtocolLib.ts index 69efd02988052..719f14b51de64 100644 --- a/packages/core/src/submodules/protocols/ProtocolLib.ts +++ b/packages/core/src/submodules/protocols/ProtocolLib.ts @@ -1,11 +1,12 @@ import { NormalizedSchema, TypeRegistry } from "@smithy/core/schema"; +import { decorateServiceException, ServiceException as SDKBaseServiceException } from "@smithy/smithy-client"; import type { HttpResponse as IHttpResponse, MetadataBearer, ResponseMetadata, StaticErrorSchema } from "@smithy/types"; /** * @internal */ type ErrorMetadataBearer = MetadataBearer & { - $response: IHttpResponse; + // $response is set by the deserializer middleware, not Protocol. $fault: "client" | "server"; }; @@ -15,6 +16,8 @@ type ErrorMetadataBearer = MetadataBearer & { * @internal */ export class ProtocolLib { + public constructor(private queryCompat = false) {} + /** * This is only for REST protocols. * @@ -74,7 +77,6 @@ export class ProtocolLib { const errorMetadata: ErrorMetadataBearer = { $metadata: metadata, - $response: response, $fault: response.statusCode < 500 ? ("client" as const) : ("server" as const), }; @@ -90,10 +92,32 @@ export class ProtocolLib { const baseExceptionSchema = synthetic.getBaseException(); if (baseExceptionSchema) { const ErrorCtor = synthetic.getErrorCtor(baseExceptionSchema) ?? Error; - throw Object.assign(new ErrorCtor({ name: errorName }), errorMetadata, dataObject); + throw this.decorateServiceException( + Object.assign(new ErrorCtor({ name: errorName }), errorMetadata), + dataObject + ); + } + throw this.decorateServiceException(Object.assign(new Error(errorName), errorMetadata), dataObject); + } + } + + /** + * Assigns additions onto exception if not already present. + */ + public decorateServiceException( + exception: E, + additions: Record = {} + ): E { + if (this.queryCompat) { + const msg = (exception as any).Message ?? additions.Message; + const error = decorateServiceException(exception, additions); + if (msg) { + (error as any).Message = msg; + (error as any).message = msg; } - throw Object.assign(new Error(errorName), errorMetadata, dataObject); + return error; } + return decorateServiceException(exception, additions); } /** diff --git a/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.spec.ts b/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.spec.ts index dd940adfc7109..3a15613d08cbc 100644 --- a/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.spec.ts +++ b/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.spec.ts @@ -4,6 +4,7 @@ import { HttpResponse } from "@smithy/protocol-http"; import type { NumericSchema, StringSchema } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; +import { context } from "../test-schema.spec"; import { AwsSmithyRpcV2CborProtocol } from "./AwsSmithyRpcV2CborProtocol"; describe(AwsSmithyRpcV2CborProtocol.name, () => { @@ -56,16 +57,8 @@ describe(AwsSmithyRpcV2CborProtocol.name, () => { requestId: undefined, }); - expect(error.$response).toEqual( - new HttpResponse({ - body, - headers: { - "x-amzn-query-error": "MyQueryError;Client", - }, - reason: undefined, - statusCode: 400, - }) - ); + // set by deserializer middleware, not Protocol. + expect(error.$response).toEqual(undefined); expect(error.Code).toEqual(MyQueryError.name); expect(error.Error.Code).toEqual(MyQueryError.name); @@ -91,4 +84,41 @@ describe(AwsSmithyRpcV2CborProtocol.name, () => { Code: "MyQueryError", }); }); + + it("decorates service exceptions with unmodeled fields", async () => { + const httpResponse = new HttpResponse({ + statusCode: 400, + headers: {}, + body: cbor.serialize({ + UnmodeledField: "Oh no", + }), + }); + + const protocol = new AwsSmithyRpcV2CborProtocol({ + defaultNamespace: "", + }); + + const output = await protocol + .deserializeResponse( + { + namespace: "ns", + name: "Empty", + traits: 0, + input: "unit" as const, + output: [3, "ns", "EmptyOutput", 0, [], []], + }, + context, + httpResponse + ) + .catch((e) => { + return e; + }); + + expect(output).toMatchObject({ + UnmodeledField: "Oh no", + $metadata: { + httpStatusCode: 400, + }, + }); + }); }); diff --git a/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.ts b/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.ts index b28f673f461a3..90c087b774dbb 100644 --- a/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.ts +++ b/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.ts @@ -19,7 +19,7 @@ import { ProtocolLib } from "../ProtocolLib"; */ export class AwsSmithyRpcV2CborProtocol extends SmithyRpcV2CborProtocol { private readonly awsQueryCompatible: boolean; - private readonly mixin = new ProtocolLib(); + private readonly mixin: ProtocolLib; public constructor({ defaultNamespace, @@ -30,6 +30,7 @@ export class AwsSmithyRpcV2CborProtocol extends SmithyRpcV2CborProtocol { }) { super({ defaultNamespace }); this.awsQueryCompatible = !!awsQueryCompatible; + this.mixin = new ProtocolLib(this.awsQueryCompatible); } /** @@ -84,14 +85,17 @@ export class AwsSmithyRpcV2CborProtocol extends SmithyRpcV2CborProtocol { this.mixin.queryCompatOutput(dataObject, output); } - throw Object.assign( - exception, - errorMetadata, - { - $fault: ns.getMergedTraits().error, - message, - }, - output + throw this.mixin.decorateServiceException( + Object.assign( + exception, + errorMetadata, + { + $fault: ns.getMergedTraits().error, + message, + }, + output + ), + dataObject ); } } diff --git a/packages/core/src/submodules/protocols/json/AwsJson1_1Protocol.spec.ts b/packages/core/src/submodules/protocols/json/AwsJson1_1Protocol.spec.ts index 56df59c9bd862..1ab24ff49fa88 100644 --- a/packages/core/src/submodules/protocols/json/AwsJson1_1Protocol.spec.ts +++ b/packages/core/src/submodules/protocols/json/AwsJson1_1Protocol.spec.ts @@ -86,4 +86,40 @@ describe(AwsJson1_1Protocol, () => { }, }); }); + + it("decorates service exceptions with unmodeled fields", async () => { + const httpResponse = new HttpResponse({ + statusCode: 400, + headers: {}, + body: Buffer.from(`{"UnmodeledField":"Oh no"}`), + }); + + const protocol = new AwsJson1_1Protocol({ + defaultNamespace: "", + serviceTarget: "JsonRpc11", + }); + + const output = await protocol + .deserializeResponse( + { + namespace: "ns", + name: "Empty", + traits: 0, + input: "unit" as const, + output: [3, "ns", "EmptyOutput", 0, [], []], + }, + context, + httpResponse + ) + .catch((e) => { + return e; + }); + + expect(output).toMatchObject({ + UnmodeledField: "Oh no", + $metadata: { + httpStatusCode: 400, + }, + }); + }); }); diff --git a/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.spec.ts b/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.spec.ts index 9d4369d1eaf98..1ce4f8dd676f7 100644 --- a/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.spec.ts +++ b/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.spec.ts @@ -80,16 +80,8 @@ describe(AwsJsonRpcProtocol.name, () => { requestId: undefined, }); - expect(error.$response).toEqual( - new HttpResponse({ - body, - headers: { - "x-amzn-query-error": "MyQueryError;Client", - }, - reason: undefined, - statusCode: 400, - }) - ); + // set by deserializer middleware, not protocol + expect(error.$response).toEqual(undefined); expect(error.Code).toEqual(MyQueryError.name); expect(error.Error.Code).toEqual(MyQueryError.name); diff --git a/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.ts b/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.ts index bc8485be200ba..f12b832f2e0ef 100644 --- a/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.ts +++ b/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.ts @@ -25,7 +25,7 @@ export abstract class AwsJsonRpcProtocol extends RpcProtocol { protected deserializer: ShapeDeserializer; protected serviceTarget: string; private readonly codec: JsonCodec; - private readonly mixin = new ProtocolLib(); + private readonly mixin: ProtocolLib; private readonly awsQueryCompatible: boolean; protected constructor({ @@ -51,6 +51,7 @@ export abstract class AwsJsonRpcProtocol extends RpcProtocol { this.serializer = this.codec.createSerializer(); this.deserializer = this.codec.createDeserializer(); this.awsQueryCompatible = !!awsQueryCompatible; + this.mixin = new ProtocolLib(this.awsQueryCompatible); } public async serializeRequest( @@ -84,6 +85,9 @@ export abstract class AwsJsonRpcProtocol extends RpcProtocol { protected abstract getJsonRpcVersion(): "1.1" | "1.0"; + /** + * @override + */ protected async handleError( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, @@ -120,14 +124,17 @@ export abstract class AwsJsonRpcProtocol extends RpcProtocol { this.mixin.queryCompatOutput(dataObject, output); } - throw Object.assign( - exception, - errorMetadata, - { - $fault: ns.getMergedTraits().error, - message, - }, - output + throw this.mixin.decorateServiceException( + Object.assign( + exception, + errorMetadata, + { + $fault: ns.getMergedTraits().error, + message, + }, + output + ), + dataObject ); } } diff --git a/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.spec.ts b/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.spec.ts index 45482ec22ade0..c8b548f506ef3 100644 --- a/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.spec.ts +++ b/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.spec.ts @@ -410,5 +410,40 @@ describe(AwsRestJsonProtocol.name, () => { payload: null, }); }); + + it("decorates service exceptions with unmodeled fields", async () => { + const httpResponse = new HttpResponse({ + statusCode: 400, + headers: {}, + body: Buffer.from(`{"UnmodeledField":"Oh no"}`), + }); + + const protocol = new AwsRestJsonProtocol({ + defaultNamespace: "", + }); + + const output = await protocol + .deserializeResponse( + { + namespace: "ns", + name: "Empty", + traits: 0, + input: "unit" as const, + output: [3, "ns", "EmptyOutput", 0, [], []], + }, + context, + httpResponse + ) + .catch((e) => { + return e; + }); + + expect(output).toMatchObject({ + UnmodeledField: "Oh no", + $metadata: { + httpStatusCode: 400, + }, + }); + }); }); }); diff --git a/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.ts b/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.ts index 7d393610239a7..fba83353e0944 100644 --- a/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.ts +++ b/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.ts @@ -139,14 +139,17 @@ export class AwsRestJsonProtocol extends HttpBindingProtocol { output[name] = this.codec.createDeserializer().readObject(member, dataObject[target]); } - throw Object.assign( - exception, - errorMetadata, - { - $fault: ns.getMergedTraits().error, - message, - }, - output + throw this.mixin.decorateServiceException( + Object.assign( + exception, + errorMetadata, + { + $fault: ns.getMergedTraits().error, + message, + }, + output + ), + dataObject ); } diff --git a/packages/core/src/submodules/protocols/query/AwsQueryProtocol.spec.ts b/packages/core/src/submodules/protocols/query/AwsQueryProtocol.spec.ts new file mode 100644 index 0000000000000..170f01f29fac6 --- /dev/null +++ b/packages/core/src/submodules/protocols/query/AwsQueryProtocol.spec.ts @@ -0,0 +1,44 @@ +import { HttpResponse } from "@smithy/protocol-http"; +import { describe, expect, test as it } from "vitest"; + +import { context } from "../test-schema.spec"; +import { AwsQueryProtocol } from "./AwsQueryProtocol"; + +describe(AwsQueryProtocol.name, () => { + it("decorates service exceptions with unmodeled fields", async () => { + const httpResponse = new HttpResponse({ + statusCode: 400, + headers: {}, + body: Buffer.from(`Oh no`), + }); + + const protocol = new AwsQueryProtocol({ + version: "", + defaultNamespace: "", + xmlNamespace: "ns", + }); + + const output = await protocol + .deserializeResponse( + { + namespace: "ns", + name: "Empty", + traits: 0, + input: "unit" as const, + output: [3, "ns", "EmptyOutput", 0, [], []], + }, + context, + httpResponse + ) + .catch((e) => { + return e; + }); + + expect(output).toMatchObject({ + UnmodeledField: "Oh no", + $metadata: { + httpStatusCode: 400, + }, + }); + }); +}); diff --git a/packages/core/src/submodules/protocols/query/AwsQueryProtocol.ts b/packages/core/src/submodules/protocols/query/AwsQueryProtocol.ts index f5c6769804df2..9426ed3863aec 100644 --- a/packages/core/src/submodules/protocols/query/AwsQueryProtocol.ts +++ b/packages/core/src/submodules/protocols/query/AwsQueryProtocol.ts @@ -135,6 +135,9 @@ export class AwsQueryProtocol extends RpcProtocol { return true; } + /** + * override + */ protected async handleError( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, @@ -183,14 +186,17 @@ export class AwsQueryProtocol extends RpcProtocol { output[name] = this.deserializer.readSchema(member, value); } - throw Object.assign( - exception, - errorMetadata, - { - $fault: ns.getMergedTraits().error, - message, - }, - output + throw this.mixin.decorateServiceException( + Object.assign( + exception, + errorMetadata, + { + $fault: ns.getMergedTraits().error, + message, + }, + output + ), + dataObject ); } diff --git a/packages/core/src/submodules/protocols/test-schema.spec.ts b/packages/core/src/submodules/protocols/test-schema.spec.ts index 2bd3ebcda5923..05f1407035128 100644 --- a/packages/core/src/submodules/protocols/test-schema.spec.ts +++ b/packages/core/src/submodules/protocols/test-schema.spec.ts @@ -1,3 +1,4 @@ +import { collectBody } from "@smithy/core/protocols"; import type { BigDecimalSchema, BigIntegerSchema, @@ -112,6 +113,7 @@ export const deleteObjects: StaticOperationSchema = [ ] satisfies StaticOperationSchema; export const context = { + streamCollector: collectBody, async endpoint() { return { hostname: "localhost", diff --git a/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.spec.ts b/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.spec.ts index 50d52576ae2f9..d4784c85b6603 100644 --- a/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.spec.ts +++ b/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.spec.ts @@ -1,6 +1,7 @@ import { HttpRequest, HttpResponse } from "@smithy/protocol-http"; import { StaticOperationSchema } from "@smithy/types"; import { toUtf8 } from "@smithy/util-utf8"; +import { Readable } from "node:stream"; import { describe, expect, test as it } from "vitest"; import { context, deleteObjects } from "../test-schema.spec"; @@ -128,4 +129,40 @@ describe(AwsRestXmlProtocol.name, () => { }, }); }); + + it("decorates service exceptions with unmodeled fields", async () => { + const httpResponse = new HttpResponse({ + statusCode: 400, + headers: {}, + body: Buffer.from(`Oh no`), + }); + + const protocol = new AwsRestXmlProtocol({ + defaultNamespace: "", + xmlNamespace: "ns", + }); + + const output = await protocol + .deserializeResponse( + { + namespace: "ns", + name: "Empty", + traits: 0, + input: "unit" as const, + output: [3, "ns", "EmptyOutput", 0, [], []], + }, + context, + httpResponse + ) + .catch((e) => { + return e; + }); + + expect(output).toMatchObject({ + UnmodeledField: "Oh no", + $metadata: { + httpStatusCode: 400, + }, + }); + }); }); diff --git a/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.ts b/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.ts index 7a30964bae622..d114fdb68820e 100644 --- a/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.ts +++ b/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.ts @@ -89,6 +89,9 @@ export class AwsRestXmlProtocol extends HttpBindingProtocol { return super.deserializeResponse(operationSchema, context, response); } + /** + * @override + */ protected async handleError( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, @@ -120,14 +123,17 @@ export class AwsRestXmlProtocol extends HttpBindingProtocol { output[name] = this.codec.createDeserializer().readSchema(member, value); } - throw Object.assign( - exception, - errorMetadata, - { - $fault: ns.getMergedTraits().error, - message, - }, - output + throw this.mixin.decorateServiceException( + Object.assign( + exception, + errorMetadata, + { + $fault: ns.getMergedTraits().error, + message, + }, + output + ), + dataObject ); } diff --git a/scripts/validation/api.json b/scripts/validation/api.json index 7a22fcba776fd..262288b94c037 100644 --- a/scripts/validation/api.json +++ b/scripts/validation/api.json @@ -584,9 +584,6 @@ "Upload": "function, since <=3.930.0" }, "@aws-sdk/client-s3": { - "AnalyticsFilter": "object, since <=3.930.0", - "MetricsFilter": "object, since <=3.930.0", - "SelectObjectContentEventStream": "object, since <=3.930.0", "$Command": "function, since <=3.930.0", "__Client": "function, since <=3.930.0", "AbortMultipartUploadCommand": "function, since <=3.930.0", @@ -604,21 +601,13 @@ "ChecksumMode": "object, since <=3.930.0", "ChecksumType": "object, since <=3.930.0", "CompleteMultipartUploadCommand": "function, since <=3.930.0", - "CompleteMultipartUploadOutputFilterSensitiveLog": "function, since <=3.930.0", - "CompleteMultipartUploadRequestFilterSensitiveLog": "function, since <=3.930.0", "CompressionType": "object, since <=3.930.0", "CopyObjectCommand": "function, since <=3.930.0", - "CopyObjectOutputFilterSensitiveLog": "function, since <=3.930.0", - "CopyObjectRequestFilterSensitiveLog": "function, since <=3.930.0", "CreateBucketCommand": "function, since <=3.930.0", "CreateBucketMetadataConfigurationCommand": "function, since <=3.930.0", "CreateBucketMetadataTableConfigurationCommand": "function, since <=3.930.0", "CreateMultipartUploadCommand": "function, since <=3.930.0", - "CreateMultipartUploadOutputFilterSensitiveLog": "function, since <=3.930.0", - "CreateMultipartUploadRequestFilterSensitiveLog": "function, since <=3.930.0", "CreateSessionCommand": "function, since <=3.930.0", - "CreateSessionOutputFilterSensitiveLog": "function, since <=3.930.0", - "CreateSessionRequestFilterSensitiveLog": "function, since <=3.930.0", "DataRedundancy": "object, since <=3.930.0", "DeleteBucketAnalyticsConfigurationCommand": "function, since <=3.930.0", "DeleteBucketCommand": "function, since <=3.930.0", @@ -641,7 +630,6 @@ "DeleteObjectsCommand": "function, since <=3.930.0", "DeletePublicAccessBlockCommand": "function, since <=3.930.0", "EncodingType": "object, since <=3.930.0", - "EncryptionFilterSensitiveLog": "function, since <=3.930.0", "EncryptionTypeMismatch": "function, since <=3.930.0", "Event": "object, since <=3.930.0", "ExistingObjectReplicationStatus": "object, since <=3.930.0", @@ -655,10 +643,8 @@ "GetBucketAnalyticsConfigurationCommand": "function, since <=3.930.0", "GetBucketCorsCommand": "function, since <=3.930.0", "GetBucketEncryptionCommand": "function, since <=3.930.0", - "GetBucketEncryptionOutputFilterSensitiveLog": "function, since <=3.930.0", "GetBucketIntelligentTieringConfigurationCommand": "function, since <=3.930.0", "GetBucketInventoryConfigurationCommand": "function, since <=3.930.0", - "GetBucketInventoryConfigurationOutputFilterSensitiveLog": "function, since <=3.930.0", "GetBucketLifecycleConfigurationCommand": "function, since <=3.930.0", "GetBucketLocationCommand": "function, since <=3.930.0", "GetBucketLoggingCommand": "function, since <=3.930.0", @@ -676,41 +662,30 @@ "GetBucketWebsiteCommand": "function, since <=3.930.0", "GetObjectAclCommand": "function, since <=3.930.0", "GetObjectAttributesCommand": "function, since <=3.930.0", - "GetObjectAttributesRequestFilterSensitiveLog": "function, since <=3.930.0", "GetObjectCommand": "function, since <=3.930.0", "GetObjectLegalHoldCommand": "function, since <=3.930.0", "GetObjectLockConfigurationCommand": "function, since <=3.930.0", - "GetObjectOutputFilterSensitiveLog": "function, since <=3.930.0", - "GetObjectRequestFilterSensitiveLog": "function, since <=3.930.0", "GetObjectRetentionCommand": "function, since <=3.930.0", "GetObjectTaggingCommand": "function, since <=3.930.0", "GetObjectTorrentCommand": "function, since <=3.930.0", - "GetObjectTorrentOutputFilterSensitiveLog": "function, since <=3.930.0", "GetPublicAccessBlockCommand": "function, since <=3.930.0", "HeadBucketCommand": "function, since <=3.930.0", "HeadObjectCommand": "function, since <=3.930.0", - "HeadObjectOutputFilterSensitiveLog": "function, since <=3.930.0", - "HeadObjectRequestFilterSensitiveLog": "function, since <=3.930.0", "IdempotencyParameterMismatch": "function, since <=3.930.0", "IntelligentTieringAccessTier": "object, since <=3.930.0", "IntelligentTieringStatus": "object, since <=3.930.0", "InvalidObjectState": "function, since <=3.930.0", "InvalidRequest": "function, since <=3.930.0", "InvalidWriteOffset": "function, since <=3.930.0", - "InventoryConfigurationFilterSensitiveLog": "function, since <=3.930.0", "InventoryConfigurationState": "object, since <=3.930.0", - "InventoryDestinationFilterSensitiveLog": "function, since <=3.930.0", - "InventoryEncryptionFilterSensitiveLog": "function, since <=3.930.0", "InventoryFormat": "object, since <=3.930.0", "InventoryFrequency": "object, since <=3.930.0", "InventoryIncludedObjectVersions": "object, since <=3.930.0", "InventoryOptionalField": "object, since <=3.930.0", - "InventoryS3BucketDestinationFilterSensitiveLog": "function, since <=3.930.0", "JSONType": "object, since <=3.930.0", "ListBucketAnalyticsConfigurationsCommand": "function, since <=3.930.0", "ListBucketIntelligentTieringConfigurationsCommand": "function, since <=3.930.0", "ListBucketInventoryConfigurationsCommand": "function, since <=3.930.0", - "ListBucketInventoryConfigurationsOutputFilterSensitiveLog": "function, since <=3.930.0", "ListBucketMetricsConfigurationsCommand": "function, since <=3.930.0", "ListBucketsCommand": "function, since <=3.930.0", "ListDirectoryBucketsCommand": "function, since <=3.930.0", @@ -719,7 +694,6 @@ "ListObjectsCommand": "function, since <=3.930.0", "ListObjectsV2Command": "function, since <=3.930.0", "ListPartsCommand": "function, since <=3.930.0", - "ListPartsRequestFilterSensitiveLog": "function, since <=3.930.0", "LocationType": "object, since <=3.930.0", "MFADelete": "object, since <=3.930.0", "MFADeleteStatus": "object, since <=3.930.0", @@ -741,7 +715,6 @@ "ObjectStorageClass": "object, since <=3.930.0", "ObjectVersionStorageClass": "object, since <=3.930.0", "OptionalObjectAttributes": "object, since <=3.930.0", - "OutputLocationFilterSensitiveLog": "function, since <=3.930.0", "OwnerOverride": "object, since <=3.930.0", "PartitionDateSource": "object, since <=3.930.0", "Payer": "object, since <=3.930.0", @@ -752,10 +725,8 @@ "PutBucketAnalyticsConfigurationCommand": "function, since <=3.930.0", "PutBucketCorsCommand": "function, since <=3.930.0", "PutBucketEncryptionCommand": "function, since <=3.930.0", - "PutBucketEncryptionRequestFilterSensitiveLog": "function, since <=3.930.0", "PutBucketIntelligentTieringConfigurationCommand": "function, since <=3.930.0", "PutBucketInventoryConfigurationCommand": "function, since <=3.930.0", - "PutBucketInventoryConfigurationRequestFilterSensitiveLog": "function, since <=3.930.0", "PutBucketLifecycleConfigurationCommand": "function, since <=3.930.0", "PutBucketLoggingCommand": "function, since <=3.930.0", "PutBucketMetricsConfigurationCommand": "function, since <=3.930.0", @@ -771,8 +742,6 @@ "PutObjectCommand": "function, since <=3.930.0", "PutObjectLegalHoldCommand": "function, since <=3.930.0", "PutObjectLockConfigurationCommand": "function, since <=3.930.0", - "PutObjectOutputFilterSensitiveLog": "function, since <=3.930.0", - "PutObjectRequestFilterSensitiveLog": "function, since <=3.930.0", "PutObjectRetentionCommand": "function, since <=3.930.0", "PutObjectTaggingCommand": "function, since <=3.930.0", "PutPublicAccessBlockCommand": "function, since <=3.930.0", @@ -785,24 +754,13 @@ "RequestCharged": "object, since <=3.930.0", "RequestPayer": "object, since <=3.930.0", "RestoreObjectCommand": "function, since <=3.930.0", - "RestoreObjectRequestFilterSensitiveLog": "function, since <=3.930.0", - "RestoreRequestFilterSensitiveLog": "function, since <=3.930.0", "RestoreRequestType": "object, since <=3.930.0", "S3": "function, since <=3.930.0", "S3Client": "function, since <=3.930.0", - "S3LocationFilterSensitiveLog": "function, since <=3.930.0", "S3ServiceException": "function, since <=3.930.0", "S3TablesBucketType": "object, since <=3.930.0", - "SSEKMSFilterSensitiveLog": "function, since <=3.930.0", "SelectObjectContentCommand": "function, since <=3.930.0", - "SelectObjectContentEventStreamFilterSensitiveLog": "function, since <=3.930.0", - "SelectObjectContentOutputFilterSensitiveLog": "function, since <=3.930.0", - "SelectObjectContentRequestFilterSensitiveLog": "function, since <=3.930.0", "ServerSideEncryption": "object, since <=3.930.0", - "ServerSideEncryptionByDefaultFilterSensitiveLog": "function, since <=3.930.0", - "ServerSideEncryptionConfigurationFilterSensitiveLog": "function, since <=3.930.0", - "ServerSideEncryptionRuleFilterSensitiveLog": "function, since <=3.930.0", - "SessionCredentialsFilterSensitiveLog": "function, since <=3.930.0", "SessionMode": "object, since <=3.930.0", "SseKmsEncryptedObjectsStatus": "object, since <=3.930.0", "StorageClass": "object, since <=3.930.0", @@ -818,12 +776,7 @@ "UpdateBucketMetadataJournalTableConfigurationCommand": "function, since <=3.930.0", "UploadPartCommand": "function, since <=3.930.0", "UploadPartCopyCommand": "function, since <=3.930.0", - "UploadPartCopyOutputFilterSensitiveLog": "function, since <=3.930.0", - "UploadPartCopyRequestFilterSensitiveLog": "function, since <=3.930.0", - "UploadPartOutputFilterSensitiveLog": "function, since <=3.930.0", - "UploadPartRequestFilterSensitiveLog": "function, since <=3.930.0", "WriteGetObjectResponseCommand": "function, since <=3.930.0", - "WriteGetObjectResponseRequestFilterSensitiveLog": "function, since <=3.930.0", "paginateListBuckets": "function, since <=3.930.0", "paginateListDirectoryBuckets": "function, since <=3.930.0", "paginateListObjectsV2": "function, since <=3.930.0", @@ -838,9 +791,6 @@ "waitUntilObjectNotExists": "function, since <=3.930.0" }, "@aws-sdk/client-s3-control": { - "ObjectLambdaContentTransformation": "object, since <=3.930.0", - "ObjectEncryptionFilter": "object, since <=3.930.0", - "JobManifestGenerator": "object, since <=3.930.0", "$Command": "function, since <=3.930.0", "__Client": "function, since <=3.930.0", "AssociateAccessGrantsIdentityCenterCommand": "function, since <=3.930.0", @@ -862,7 +812,6 @@ "CreateJobCommand": "function, since <=3.930.0", "CreateMultiRegionAccessPointCommand": "function, since <=3.930.0", "CreateStorageLensGroupCommand": "function, since <=3.930.0", - "CredentialsFilterSensitiveLog": "function, since <=3.930.0", "DeleteAccessGrantCommand": "function, since <=3.930.0", "DeleteAccessGrantsInstanceCommand": "function, since <=3.930.0", "DeleteAccessGrantsInstanceResourcePolicyCommand": "function, since <=3.930.0", @@ -911,7 +860,6 @@ "GetBucketTaggingCommand": "function, since <=3.930.0", "GetBucketVersioningCommand": "function, since <=3.930.0", "GetDataAccessCommand": "function, since <=3.930.0", - "GetDataAccessResultFilterSensitiveLog": "function, since <=3.930.0", "GetJobTaggingCommand": "function, since <=3.930.0", "GetMultiRegionAccessPointCommand": "function, since <=3.930.0", "GetMultiRegionAccessPointPolicyCommand": "function, since <=3.930.0", @@ -1022,7 +970,6 @@ "paginateListStorageLensGroups": "function, since <=3.930.0" }, "@aws-sdk/client-dynamodb": { - "AttributeValue": "object, since <=3.930.0", "$Command": "function, since <=3.930.0", "__Client": "function, since <=3.930.0", "ApproximateCreationDateTimePrecision": "object, since <=3.930.0",