Skip to content

Commit 7c3ee84

Browse files
authored
fix(core/schema): fix http binding struct iteration (#1638)
1 parent d105c97 commit 7c3ee84

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

.changeset/plenty-apes-accept.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

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

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@ import { HttpProtocol } from "./HttpProtocol";
2424
export abstract class HttpBindingProtocol extends HttpProtocol {
2525
public async serializeRequest<Input extends object>(
2626
operationSchema: OperationSchema,
27-
input: Input,
27+
_input: Input,
2828
context: HandlerExecutionContext & SerdeFunctions & EndpointBearer
2929
): Promise<IHttpRequest> {
30+
const input: any = {
31+
...(_input ?? {}),
32+
};
3033
const serializer = this.serializer;
3134
const query = {} as Record<string, string | string[]>;
3235
const headers = {} as Record<string, string>;
@@ -66,13 +69,13 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
6669
}
6770
}
6871

69-
const _input: any = {
70-
...input,
71-
};
72-
7372
for (const [memberName, memberNs] of ns.structIterator()) {
74-
const memberTraits = memberNs.getMergedTraits();
75-
const inputMember = (_input as any)[memberName] as any;
73+
const memberTraits = memberNs.getMergedTraits() ?? {};
74+
const inputMemberValue = input[memberName];
75+
76+
if (inputMemberValue == null) {
77+
continue;
78+
}
7679

7780
if (memberTraits.httpPayload) {
7881
const isStreaming = memberNs.isStreaming();
@@ -83,15 +86,16 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
8386
throw new Error("serialization of event streams is not yet implemented");
8487
} else {
8588
// streaming blob body
86-
payload = inputMember;
89+
payload = inputMemberValue;
8790
}
8891
} else {
8992
// structural/document body
90-
serializer.write(memberNs, inputMember);
93+
serializer.write(memberNs, inputMemberValue);
9194
payload = serializer.flush();
9295
}
96+
delete input[memberName];
9397
} else if (memberTraits.httpLabel) {
94-
serializer.write(memberNs, inputMember);
98+
serializer.write(memberNs, inputMemberValue);
9599
const replacement = serializer.flush() as string;
96100
if (request.path.includes(`{${memberName}+}`)) {
97101
request.path = request.path.replace(
@@ -101,28 +105,28 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
101105
} else if (request.path.includes(`{${memberName}}`)) {
102106
request.path = request.path.replace(`{${memberName}}`, extendedEncodeURIComponent(replacement));
103107
}
104-
delete _input[memberName];
108+
delete input[memberName];
105109
} else if (memberTraits.httpHeader) {
106-
serializer.write(memberNs, inputMember);
110+
serializer.write(memberNs, inputMemberValue);
107111
headers[memberTraits.httpHeader.toLowerCase() as string] = String(serializer.flush());
108-
delete _input[memberName];
112+
delete input[memberName];
109113
} else if (typeof memberTraits.httpPrefixHeaders === "string") {
110-
for (const [key, val] of Object.entries(inputMember)) {
114+
for (const [key, val] of Object.entries(inputMemberValue)) {
111115
const amalgam = memberTraits.httpPrefixHeaders + key;
112116
serializer.write([memberNs.getValueSchema(), { httpHeader: amalgam }], val);
113117
headers[amalgam.toLowerCase()] = serializer.flush() as string;
114118
}
115-
delete _input[memberName];
119+
delete input[memberName];
116120
} else if (memberTraits.httpQuery || memberTraits.httpQueryParams) {
117-
this.serializeQuery(memberNs, inputMember, query);
118-
delete _input[memberName];
121+
this.serializeQuery(memberNs, inputMemberValue, query);
122+
delete input[memberName];
119123
} else {
120124
hasNonHttpBindingMember = true;
121125
}
122126
}
123127

124128
if (hasNonHttpBindingMember && input) {
125-
serializer.write(schema, _input);
129+
serializer.write(schema, input);
126130
payload = serializer.flush() as Uint8Array;
127131
}
128132

0 commit comments

Comments
 (0)