@@ -24,9 +24,12 @@ import { HttpProtocol } from "./HttpProtocol";
24
24
export abstract class HttpBindingProtocol extends HttpProtocol {
25
25
public async serializeRequest < Input extends object > (
26
26
operationSchema : OperationSchema ,
27
- input : Input ,
27
+ _input : Input ,
28
28
context : HandlerExecutionContext & SerdeFunctions & EndpointBearer
29
29
) : Promise < IHttpRequest > {
30
+ const input : any = {
31
+ ...( _input ?? { } ) ,
32
+ } ;
30
33
const serializer = this . serializer ;
31
34
const query = { } as Record < string , string | string [ ] > ;
32
35
const headers = { } as Record < string , string > ;
@@ -66,13 +69,13 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
66
69
}
67
70
}
68
71
69
- const _input : any = {
70
- ...input ,
71
- } ;
72
-
73
72
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
+ }
76
79
77
80
if ( memberTraits . httpPayload ) {
78
81
const isStreaming = memberNs . isStreaming ( ) ;
@@ -83,15 +86,16 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
83
86
throw new Error ( "serialization of event streams is not yet implemented" ) ;
84
87
} else {
85
88
// streaming blob body
86
- payload = inputMember ;
89
+ payload = inputMemberValue ;
87
90
}
88
91
} else {
89
92
// structural/document body
90
- serializer . write ( memberNs , inputMember ) ;
93
+ serializer . write ( memberNs , inputMemberValue ) ;
91
94
payload = serializer . flush ( ) ;
92
95
}
96
+ delete input [ memberName ] ;
93
97
} else if ( memberTraits . httpLabel ) {
94
- serializer . write ( memberNs , inputMember ) ;
98
+ serializer . write ( memberNs , inputMemberValue ) ;
95
99
const replacement = serializer . flush ( ) as string ;
96
100
if ( request . path . includes ( `{${ memberName } +}` ) ) {
97
101
request . path = request . path . replace (
@@ -101,28 +105,28 @@ export abstract class HttpBindingProtocol extends HttpProtocol {
101
105
} else if ( request . path . includes ( `{${ memberName } }` ) ) {
102
106
request . path = request . path . replace ( `{${ memberName } }` , extendedEncodeURIComponent ( replacement ) ) ;
103
107
}
104
- delete _input [ memberName ] ;
108
+ delete input [ memberName ] ;
105
109
} else if ( memberTraits . httpHeader ) {
106
- serializer . write ( memberNs , inputMember ) ;
110
+ serializer . write ( memberNs , inputMemberValue ) ;
107
111
headers [ memberTraits . httpHeader . toLowerCase ( ) as string ] = String ( serializer . flush ( ) ) ;
108
- delete _input [ memberName ] ;
112
+ delete input [ memberName ] ;
109
113
} else if ( typeof memberTraits . httpPrefixHeaders === "string" ) {
110
- for ( const [ key , val ] of Object . entries ( inputMember ) ) {
114
+ for ( const [ key , val ] of Object . entries ( inputMemberValue ) ) {
111
115
const amalgam = memberTraits . httpPrefixHeaders + key ;
112
116
serializer . write ( [ memberNs . getValueSchema ( ) , { httpHeader : amalgam } ] , val ) ;
113
117
headers [ amalgam . toLowerCase ( ) ] = serializer . flush ( ) as string ;
114
118
}
115
- delete _input [ memberName ] ;
119
+ delete input [ memberName ] ;
116
120
} 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 ] ;
119
123
} else {
120
124
hasNonHttpBindingMember = true ;
121
125
}
122
126
}
123
127
124
128
if ( hasNonHttpBindingMember && input ) {
125
- serializer . write ( schema , _input ) ;
129
+ serializer . write ( schema , input ) ;
126
130
payload = serializer . flush ( ) as Uint8Array ;
127
131
}
128
132
0 commit comments