11use { ConnectionError , Frame , Peer } ;
2+ use HeaderMap ;
23use frame:: { self , StreamId } ;
34use client:: Client ;
45use server:: Server ;
@@ -108,6 +109,17 @@ impl<T, P, B> Connection<T, P, B>
108109 } )
109110 }
110111
112+ pub fn send_trailers ( self ,
113+ id : StreamId ,
114+ headers : HeaderMap )
115+ -> sink:: Send < Self >
116+ {
117+ self . send ( Frame :: Trailers {
118+ id,
119+ headers,
120+ } )
121+ }
122+
111123 pub fn start_ping ( & mut self , _body : PingPayload ) -> StartSend < PingPayload , ConnectionError > {
112124 unimplemented ! ( ) ;
113125 }
@@ -167,7 +179,7 @@ impl<T, P, B> Connection<T, P, B>
167179 Some ( Headers ( frame) ) => {
168180 trace ! ( "recv HEADERS; frame={:?}" , frame) ;
169181 // Update stream state while ensuring that the headers frame
170- // can be received
182+ // can be received.
171183 if let Some ( frame) = try!( self . streams . recv_headers ( frame) ) {
172184 let frame = Self :: convert_poll_message ( frame) ;
173185 return Ok ( Some ( frame) . into ( ) ) ;
@@ -224,8 +236,10 @@ impl<T, P, B> Connection<T, P, B>
224236
225237 fn convert_poll_message ( frame : frame:: Headers ) -> Frame < P :: Poll > {
226238 if frame. is_trailers ( ) {
227- // TODO: return trailers
228- unimplemented ! ( ) ;
239+ Frame :: Trailers {
240+ id : frame. stream_id ( ) ,
241+ headers : frame. into_fields ( )
242+ }
229243 } else {
230244 Frame :: Headers {
231245 id : frame. stream_id ( ) ,
@@ -328,7 +342,6 @@ impl<T, P, B> Sink for Connection<T, P, B>
328342
329343 frame:: Frame :: Headers ( frame)
330344 }
331-
332345 Frame :: Data { id, data, end_of_stream } => {
333346 let frame = frame:: Data :: from_buf (
334347 id, data. into_buf ( ) , end_of_stream) ;
@@ -337,13 +350,20 @@ impl<T, P, B> Sink for Connection<T, P, B>
337350
338351 frame. into ( )
339352 }
340-
341353 Frame :: Reset { id, error } => frame:: Reset :: new ( id, error) . into ( ) ,
342-
343- /*
344354 Frame :: Trailers { id, headers } => {
345- unimplemented!();
355+ let mut frame = frame:: Headers :: new (
356+ id,
357+ frame:: Pseudo :: default ( ) ,
358+ headers) ;
359+
360+ frame. set_end_stream ( ) ;
361+
362+ self . streams . send_headers ( & frame) ?;
363+
364+ frame:: Frame :: Headers ( frame)
346365 }
366+ /*
347367 Frame::PushPromise { id, promise } => {
348368 unimplemented!();
349369 }
0 commit comments