From 9702d7fd7c8d79ffe3095fd8670f055fee37413f Mon Sep 17 00:00:00 2001 From: George Fu Date: Tue, 3 Jun 2025 15:36:09 -0400 Subject: [PATCH] fix(core/protocols): allow http prefix header and http header to read same value --- .changeset/big-hounds-jog.md | 5 ++ .../protocols/HttpBindingProtocol.ts | 10 +--- .../submodules/protocols/HttpProtocol.spec.ts | 55 +++++++++++++++++++ .../src/submodules/protocols/HttpProtocol.ts | 3 +- 4 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 .changeset/big-hounds-jog.md create mode 100644 packages/core/src/submodules/protocols/HttpProtocol.spec.ts diff --git a/.changeset/big-hounds-jog.md b/.changeset/big-hounds-jog.md new file mode 100644 index 00000000000..73eafcca133 --- /dev/null +++ b/.changeset/big-hounds-jog.md @@ -0,0 +1,5 @@ +--- +"@smithy/core": patch +--- + +allow http prefix header and header to read from same binding diff --git a/packages/core/src/submodules/protocols/HttpBindingProtocol.ts b/packages/core/src/submodules/protocols/HttpBindingProtocol.ts index 14f49e7ba0c..80c3d26dfec 100644 --- a/packages/core/src/submodules/protocols/HttpBindingProtocol.ts +++ b/packages/core/src/submodules/protocols/HttpBindingProtocol.ts @@ -207,15 +207,7 @@ export abstract class HttpBindingProtocol extends HttpProtocol { response.headers[header.toLowerCase()] = value; } - const headerBindings = new Set( - Object.values(ns.getMemberSchemas()) - .map((schema) => { - return schema.getMergedTraits().httpHeader; - }) - .filter(Boolean) as string[] - ); - - const nonHttpBindingMembers = await this.deserializeHttpMessage(ns, context, response, headerBindings, dataObject); + const nonHttpBindingMembers = await this.deserializeHttpMessage(ns, context, response, dataObject); if (nonHttpBindingMembers.length) { const bytes: Uint8Array = await collectBody(response.body, context); diff --git a/packages/core/src/submodules/protocols/HttpProtocol.spec.ts b/packages/core/src/submodules/protocols/HttpProtocol.spec.ts new file mode 100644 index 00000000000..d2d183a23a0 --- /dev/null +++ b/packages/core/src/submodules/protocols/HttpProtocol.spec.ts @@ -0,0 +1,55 @@ +import { map, SCHEMA, struct } from "@smithy/core/schema"; +import { HandlerExecutionContext, HttpResponse as IHttpResponse, Schema, SerdeFunctions } from "@smithy/types"; +import { describe, expect, test as it } from "vitest"; + +import { HttpProtocol } from "./HttpProtocol"; +import { FromStringShapeDeserializer } from "./serde/FromStringShapeDeserializer"; + +describe(HttpProtocol.name, () => { + it("can deserialize a prefix header binding and header binding from the same header", async () => { + type TestSignature = ( + schema: Schema, + context: HandlerExecutionContext & SerdeFunctions, + response: IHttpResponse, + dataObject: any + ) => Promise; + const deserializeHttpMessage = ((HttpProtocol.prototype as any).deserializeHttpMessage as TestSignature).bind({ + deserializer: new FromStringShapeDeserializer({ + httpBindings: true, + timestampFormat: { + useTrait: true, + default: SCHEMA.TIMESTAMP_EPOCH_SECONDS, + }, + }), + }); + const httpResponse: IHttpResponse = { + statusCode: 200, + headers: { + "my-header": "header-value", + }, + }; + + const dataObject = {}; + await deserializeHttpMessage( + struct( + "", + "Struct", + 0, + ["prefixHeaders", "header"], + [ + [map("", "Map", 0, 0, 0), { httpPrefixHeaders: "my-" }], + [0, { httpHeader: "my-header" }], + ] + ), + {} as any, + httpResponse, + dataObject + ); + expect(dataObject).toEqual({ + prefixHeaders: { + header: "header-value", + }, + header: "header-value", + }); + }); +}); diff --git a/packages/core/src/submodules/protocols/HttpProtocol.ts b/packages/core/src/submodules/protocols/HttpProtocol.ts index c8e754890e2..b9dea9f7e00 100644 --- a/packages/core/src/submodules/protocols/HttpProtocol.ts +++ b/packages/core/src/submodules/protocols/HttpProtocol.ts @@ -147,7 +147,6 @@ export abstract class HttpProtocol implements ClientProtocol, dataObject: any ): Promise { const deserializer = this.deserializer; @@ -222,7 +221,7 @@ export abstract class HttpProtocol implements ClientProtocol