Skip to content

Commit 2bc725d

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

File tree

2 files changed

+17
-18
lines changed

2 files changed

+17
-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: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ 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 = _input ?? {};
3031
const serializer = this.serializer;
3132
const query = {} as Record<string, string | string[]>;
3233
const headers = {} as Record<string, string>;
@@ -66,13 +67,13 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
6667
}
6768
}
6869

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

7778
if (memberTraits.httpPayload) {
7879
const isStreaming = memberNs.isStreaming();
@@ -83,15 +84,15 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
8384
throw new Error("serialization of event streams is not yet implemented");
8485
} else {
8586
// streaming blob body
86-
payload = inputMember;
87+
payload = inputMemberValue;
8788
}
8889
} else {
8990
// structural/document body
90-
serializer.write(memberNs, inputMember);
91+
serializer.write(memberNs, inputMemberValue);
9192
payload = serializer.flush();
9293
}
9394
} else if (memberTraits.httpLabel) {
94-
serializer.write(memberNs, inputMember);
95+
serializer.write(memberNs, inputMemberValue);
9596
const replacement = serializer.flush() as string;
9697
if (request.path.includes(`{${memberName}+}`)) {
9798
request.path = request.path.replace(
@@ -101,28 +102,24 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
101102
} else if (request.path.includes(`{${memberName}}`)) {
102103
request.path = request.path.replace(`{${memberName}}`, extendedEncodeURIComponent(replacement));
103104
}
104-
delete _input[memberName];
105105
} else if (memberTraits.httpHeader) {
106-
serializer.write(memberNs, inputMember);
106+
serializer.write(memberNs, inputMemberValue);
107107
headers[memberTraits.httpHeader.toLowerCase() as string] = String(serializer.flush());
108-
delete _input[memberName];
109108
} else if (typeof memberTraits.httpPrefixHeaders === "string") {
110-
for (const [key, val] of Object.entries(inputMember)) {
109+
for (const [key, val] of Object.entries(inputMemberValue)) {
111110
const amalgam = memberTraits.httpPrefixHeaders + key;
112111
serializer.write([memberNs.getValueSchema(), { httpHeader: amalgam }], val);
113112
headers[amalgam.toLowerCase()] = serializer.flush() as string;
114113
}
115-
delete _input[memberName];
116114
} else if (memberTraits.httpQuery || memberTraits.httpQueryParams) {
117-
this.serializeQuery(memberNs, inputMember, query);
118-
delete _input[memberName];
115+
this.serializeQuery(memberNs, inputMemberValue, query);
119116
} else {
120117
hasNonHttpBindingMember = true;
121118
}
122119
}
123120

124121
if (hasNonHttpBindingMember && input) {
125-
serializer.write(schema, _input);
122+
serializer.write(schema, input);
126123
payload = serializer.flush() as Uint8Array;
127124
}
128125

0 commit comments

Comments
 (0)