Skip to content

Commit 44ff1ce

Browse files
committed
fix(core/schema): fix http binding struct iteration
1 parent d105c97 commit 44ff1ce

File tree

1 file changed

+41
-39
lines changed

1 file changed

+41
-39
lines changed

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

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -66,63 +66,65 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
6666
}
6767
}
6868

69-
const _input: any = {
70-
...input,
71-
};
72-
7369
for (const [memberName, memberNs] of ns.structIterator()) {
74-
const memberTraits = memberNs.getMergedTraits();
75-
const inputMember = (_input as any)[memberName] as any;
70+
const memberTraits = memberNs.getMergedTraits() ?? {};
71+
const inputMemberValue = (input as any)[memberName] as any;
7672

7773
if (memberTraits.httpPayload) {
78-
const isStreaming = memberNs.isStreaming();
79-
if (isStreaming) {
80-
const isEventStream = memberNs.isStructSchema();
81-
if (isEventStream) {
82-
// todo(schema)
83-
throw new Error("serialization of event streams is not yet implemented");
74+
if (inputMemberValue != null) {
75+
const isStreaming = memberNs.isStreaming();
76+
if (isStreaming) {
77+
const isEventStream = memberNs.isStructSchema();
78+
if (isEventStream) {
79+
// todo(schema)
80+
throw new Error("serialization of event streams is not yet implemented");
81+
} else {
82+
// streaming blob body
83+
payload = inputMemberValue;
84+
}
8485
} else {
85-
// streaming blob body
86-
payload = inputMember;
86+
// structural/document body
87+
serializer.write(memberNs, inputMemberValue);
88+
payload = serializer.flush();
8789
}
88-
} else {
89-
// structural/document body
90-
serializer.write(memberNs, inputMember);
91-
payload = serializer.flush();
9290
}
9391
} else if (memberTraits.httpLabel) {
94-
serializer.write(memberNs, inputMember);
95-
const replacement = serializer.flush() as string;
96-
if (request.path.includes(`{${memberName}+}`)) {
97-
request.path = request.path.replace(
98-
`{${memberName}+}`,
99-
replacement.split("/").map(extendedEncodeURIComponent).join("/")
100-
);
101-
} else if (request.path.includes(`{${memberName}}`)) {
102-
request.path = request.path.replace(`{${memberName}}`, extendedEncodeURIComponent(replacement));
92+
if (inputMemberValue != null) {
93+
serializer.write(memberNs, inputMemberValue);
94+
const replacement = serializer.flush() as string;
95+
if (request.path.includes(`{${memberName}+}`)) {
96+
request.path = request.path.replace(
97+
`{${memberName}+}`,
98+
replacement.split("/").map(extendedEncodeURIComponent).join("/")
99+
);
100+
} else if (request.path.includes(`{${memberName}}`)) {
101+
request.path = request.path.replace(`{${memberName}}`, extendedEncodeURIComponent(replacement));
102+
}
103103
}
104-
delete _input[memberName];
105104
} else if (memberTraits.httpHeader) {
106-
serializer.write(memberNs, inputMember);
107-
headers[memberTraits.httpHeader.toLowerCase() as string] = String(serializer.flush());
108-
delete _input[memberName];
105+
if (inputMemberValue != null) {
106+
serializer.write(memberNs, inputMemberValue);
107+
headers[memberTraits.httpHeader.toLowerCase() as string] = String(serializer.flush());
108+
}
109109
} else if (typeof memberTraits.httpPrefixHeaders === "string") {
110-
for (const [key, val] of Object.entries(inputMember)) {
111-
const amalgam = memberTraits.httpPrefixHeaders + key;
112-
serializer.write([memberNs.getValueSchema(), { httpHeader: amalgam }], val);
113-
headers[amalgam.toLowerCase()] = serializer.flush() as string;
110+
if (inputMemberValue != null) {
111+
for (const [key, val] of Object.entries(inputMemberValue)) {
112+
const amalgam = memberTraits.httpPrefixHeaders + key;
113+
serializer.write([memberNs.getValueSchema(), { httpHeader: amalgam }], val);
114+
headers[amalgam.toLowerCase()] = serializer.flush() as string;
115+
}
114116
}
115-
delete _input[memberName];
116117
} else if (memberTraits.httpQuery || memberTraits.httpQueryParams) {
117-
this.serializeQuery(memberNs, inputMember, query);
118-
delete _input[memberName];
118+
if (inputMemberValue != null) {
119+
this.serializeQuery(memberNs, inputMemberValue, query);
120+
}
119121
} else {
120122
hasNonHttpBindingMember = true;
121123
}
122124
}
123125

124126
if (hasNonHttpBindingMember && input) {
125-
serializer.write(schema, _input);
127+
serializer.write(schema, input);
126128
payload = serializer.flush() as Uint8Array;
127129
}
128130

0 commit comments

Comments
 (0)