@@ -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