@@ -24,9 +24,10 @@ 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 = _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