@@ -24,9 +24,12 @@ import { HttpProtocol } from "./HttpProtocol";
2424export 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