1
1
use crate :: pb:: { self , * } ;
2
2
use async_stream:: try_stream;
3
- use http:: header:: { HeaderName , HeaderValue } ;
4
- use http_body :: Body as HttpBody ;
3
+ use http:: header:: { HeaderMap , HeaderName } ;
4
+ use http_body_util :: BodyExt ;
5
5
use std:: future:: Future ;
6
6
use std:: pin:: Pin ;
7
7
use std:: result:: Result as StdResult ;
8
- use std:: task:: { ready , Context , Poll } ;
8
+ use std:: task:: { Context , Poll } ;
9
9
use std:: time:: Duration ;
10
10
use tokio_stream:: StreamExt ;
11
11
use tonic:: { body:: Body , server:: NamedService , Code , Request , Response , Status } ;
@@ -196,11 +196,12 @@ where
196
196
fn call ( & mut self , req : http:: Request < Body > ) -> Self :: Future {
197
197
let echo_header = req. headers ( ) . get ( "x-grpc-test-echo-initial" ) . cloned ( ) ;
198
198
199
+ let trailer_name = HeaderName :: from_static ( "x-grpc-test-echo-trailing-bin" ) ;
199
200
let echo_trailer = req
200
201
. headers ( )
201
- . get ( "x-grpc-test-echo-trailing-bin" )
202
+ . get ( & trailer_name )
202
203
. cloned ( )
203
- . map ( |v| ( HeaderName :: from_static ( "x-grpc-test-echo-trailing-bin" ) , v) ) ;
204
+ . map ( |v| HeaderMap :: from_iter ( std :: iter :: once ( ( trailer_name , v) ) ) ) ;
204
205
205
206
let call = self . inner . call ( req) ;
206
207
@@ -211,42 +212,11 @@ where
211
212
res. headers_mut ( )
212
213
. insert ( "x-grpc-test-echo-initial" , echo_header) ;
213
214
Ok ( res
214
- . map ( |b| MergeTrailers :: new ( b , echo_trailer) )
215
+ . map ( |b| b . with_trailers ( async move { echo_trailer. map ( Ok ) } ) )
215
216
. map ( Body :: new) )
216
217
} else {
217
218
Ok ( res)
218
219
}
219
220
} )
220
221
}
221
222
}
222
-
223
- pub struct MergeTrailers < B > {
224
- inner : B ,
225
- trailer : Option < ( HeaderName , HeaderValue ) > ,
226
- }
227
-
228
- impl < B > MergeTrailers < B > {
229
- pub fn new ( inner : B , trailer : Option < ( HeaderName , HeaderValue ) > ) -> Self {
230
- Self { inner, trailer }
231
- }
232
- }
233
-
234
- impl < B : HttpBody + Unpin > HttpBody for MergeTrailers < B > {
235
- type Data = B :: Data ;
236
- type Error = B :: Error ;
237
-
238
- fn poll_frame (
239
- self : Pin < & mut Self > ,
240
- cx : & mut Context < ' _ > ,
241
- ) -> Poll < Option < StdResult < http_body:: Frame < Self :: Data > , Self :: Error > > > {
242
- let this = self . get_mut ( ) ;
243
- let mut frame = ready ! ( Pin :: new( & mut this. inner) . poll_frame( cx) ?) ;
244
- if let ( Some ( trailers) , Some ( ( key, value) ) ) = (
245
- frame. as_mut ( ) . and_then ( |frame| frame. trailers_mut ( ) ) ,
246
- & this. trailer ,
247
- ) {
248
- trailers. insert ( key. clone ( ) , value. clone ( ) ) ;
249
- }
250
- Poll :: Ready ( frame. map ( Ok ) )
251
- }
252
- }
0 commit comments