Skip to content

Commit 4642e7e

Browse files
authored
fix(core/protocols): allow http prefix header and http header to read same value (#1610)
1 parent ae8f1f4 commit 4642e7e

File tree

4 files changed

+62
-11
lines changed

4 files changed

+62
-11
lines changed

.changeset/big-hounds-jog.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@smithy/core": patch
3+
---
4+
5+
allow http prefix header and header to read from same binding

packages/core/src/submodules/protocols/HttpBindingProtocol.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -207,15 +207,7 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
207207
response.headers[header.toLowerCase()] = value;
208208
}
209209

210-
const headerBindings = new Set<string>(
211-
Object.values(ns.getMemberSchemas())
212-
.map((schema) => {
213-
return schema.getMergedTraits().httpHeader;
214-
})
215-
.filter(Boolean) as string[]
216-
);
217-
218-
const nonHttpBindingMembers = await this.deserializeHttpMessage(ns, context, response, headerBindings, dataObject);
210+
const nonHttpBindingMembers = await this.deserializeHttpMessage(ns, context, response, dataObject);
219211

220212
if (nonHttpBindingMembers.length) {
221213
const bytes: Uint8Array = await collectBody(response.body, context);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { map, SCHEMA, struct } from "@smithy/core/schema";
2+
import { HandlerExecutionContext, HttpResponse as IHttpResponse, Schema, SerdeFunctions } from "@smithy/types";
3+
import { describe, expect, test as it } from "vitest";
4+
5+
import { HttpProtocol } from "./HttpProtocol";
6+
import { FromStringShapeDeserializer } from "./serde/FromStringShapeDeserializer";
7+
8+
describe(HttpProtocol.name, () => {
9+
it("can deserialize a prefix header binding and header binding from the same header", async () => {
10+
type TestSignature = (
11+
schema: Schema,
12+
context: HandlerExecutionContext & SerdeFunctions,
13+
response: IHttpResponse,
14+
dataObject: any
15+
) => Promise<string[]>;
16+
const deserializeHttpMessage = ((HttpProtocol.prototype as any).deserializeHttpMessage as TestSignature).bind({
17+
deserializer: new FromStringShapeDeserializer({
18+
httpBindings: true,
19+
timestampFormat: {
20+
useTrait: true,
21+
default: SCHEMA.TIMESTAMP_EPOCH_SECONDS,
22+
},
23+
}),
24+
});
25+
const httpResponse: IHttpResponse = {
26+
statusCode: 200,
27+
headers: {
28+
"my-header": "header-value",
29+
},
30+
};
31+
32+
const dataObject = {};
33+
await deserializeHttpMessage(
34+
struct(
35+
"",
36+
"Struct",
37+
0,
38+
["prefixHeaders", "header"],
39+
[
40+
[map("", "Map", 0, 0, 0), { httpPrefixHeaders: "my-" }],
41+
[0, { httpHeader: "my-header" }],
42+
]
43+
),
44+
{} as any,
45+
httpResponse,
46+
dataObject
47+
);
48+
expect(dataObject).toEqual({
49+
prefixHeaders: {
50+
header: "header-value",
51+
},
52+
header: "header-value",
53+
});
54+
});
55+
});

packages/core/src/submodules/protocols/HttpProtocol.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ export abstract class HttpProtocol implements ClientProtocol<IHttpRequest, IHttp
147147
schema: Schema,
148148
context: HandlerExecutionContext & SerdeFunctions,
149149
response: IHttpResponse,
150-
headerBindings: Set<string>,
151150
dataObject: any
152151
): Promise<string[]> {
153152
const deserializer = this.deserializer;
@@ -222,7 +221,7 @@ export abstract class HttpProtocol implements ClientProtocol<IHttpRequest, IHttp
222221
} else if (memberTraits.httpPrefixHeaders !== undefined) {
223222
dataObject[memberName] = {};
224223
for (const [header, value] of Object.entries(response.headers)) {
225-
if (!headerBindings.has(header) && header.startsWith(memberTraits.httpPrefixHeaders)) {
224+
if (header.startsWith(memberTraits.httpPrefixHeaders)) {
226225
dataObject[memberName][header.slice(memberTraits.httpPrefixHeaders.length)] = await deserializer.read(
227226
[memberSchema.getValueSchema(), { httpHeader: header }],
228227
value

0 commit comments

Comments
 (0)