@@ -32,9 +32,9 @@ pub struct ChunkedDecoder<R: BufRead> {
32
32
/// Current state.
33
33
state : State ,
34
34
/// Trailer channel sender.
35
- trailer_sender : Sender < ( HeaderName , HeaderValue ) > ,
35
+ trailer_sender : Sender < Vec < ( HeaderName , HeaderValue ) > > ,
36
36
/// Trailer channel receiver.
37
- trailer_receiver : Receiver < ( HeaderName , HeaderValue ) > ,
37
+ trailer_receiver : Receiver < Vec < ( HeaderName , HeaderValue ) > > ,
38
38
}
39
39
40
40
impl < R : BufRead > ChunkedDecoder < R > {
@@ -52,7 +52,7 @@ impl<R: BufRead> ChunkedDecoder<R> {
52
52
}
53
53
}
54
54
55
- pub fn trailer ( & self ) -> Receiver < ( HeaderName , HeaderValue ) > {
55
+ pub fn trailer ( & self ) -> Receiver < Vec < ( HeaderName , HeaderValue ) > > {
56
56
self . trailer_receiver . clone ( )
57
57
}
58
58
}
@@ -124,6 +124,8 @@ fn decode_trailer(buffer: Block<'static>, pos: &Position) -> io::Result<DecodeRe
124
124
125
125
match httparse:: parse_headers ( & buffer[ pos. start ..pos. end ] , & mut headers) {
126
126
Ok ( Status :: Complete ( ( used, headers) ) ) => {
127
+ dbg ! ( & headers) ;
128
+
127
129
let headers = headers
128
130
. iter ( )
129
131
. map ( |header| {
@@ -169,18 +171,26 @@ impl<R: BufRead + Unpin + Send + 'static> ChunkedDecoder<R> {
169
171
let remaining = ( len - current) as usize ;
170
172
let mut to_read = std:: cmp:: min ( remaining, buf. len ( ) ) ;
171
173
let mut new_current = current;
174
+ let mut start = 0 ;
172
175
173
176
// first drain the buffer
174
177
if pos. len ( ) > 0 {
175
178
let to_read_buf = std:: cmp:: min ( to_read, pos. len ( ) ) ;
179
+ dbg ! ( std:: str :: from_utf8( & buffer[ pos. start..pos. start + to_read_buf] ) . unwrap( ) ) ;
176
180
buf[ ..to_read_buf] . copy_from_slice ( & buffer[ pos. start ..pos. start + to_read_buf] ) ;
177
181
to_read -= to_read_buf;
178
182
new_pos. start += to_read_buf;
179
183
new_current += to_read_buf as u64 ;
184
+ start += to_read_buf;
180
185
}
181
186
182
187
if to_read > 0 {
183
- let n = match Pin :: new ( & mut self . inner ) . poll_read ( cx, & mut buf[ ..to_read] ) {
188
+ dbg ! ( "reading" ) ;
189
+ dbg ! ( to_read) ;
190
+ dbg ! ( start) ;
191
+ let n = match Pin :: new ( & mut self . inner )
192
+ . poll_read ( cx, & mut buf[ start..start + to_read] )
193
+ {
184
194
Poll :: Ready ( val) => val?,
185
195
Poll :: Pending => {
186
196
return Ok ( DecodeResult :: Some {
@@ -232,21 +242,22 @@ impl<R: BufRead + Unpin + Send + 'static> ChunkedDecoder<R> {
232
242
}
233
243
State :: TrailerDone ( ref mut headers) => {
234
244
let headers = std:: mem:: replace ( headers, Vec :: new ( ) ) ;
235
- for ( name , value ) in headers. into_iter ( ) {
236
- let mut fut = Box :: pin ( self . trailer_sender . send ( ( name , value ) ) ) ;
237
- match Pin :: new ( & mut fut) . poll ( cx) {
238
- Poll :: Ready ( _) => { }
239
- Poll :: Pending => {
240
- return Ok ( DecodeResult :: Some {
241
- read : 0 ,
242
- new_state : self . state . clone ( ) ,
243
- new_pos : pos . clone ( ) ,
244
- buffer ,
245
- pending : true ,
246
- } ) ;
247
- }
245
+ dbg ! ( " headers send" ) ;
246
+ let mut fut = Box :: pin ( self . trailer_sender . send ( headers ) ) ;
247
+ match Pin :: new ( & mut fut) . poll ( cx) {
248
+ Poll :: Ready ( _) => { }
249
+ Poll :: Pending => {
250
+ dbg ! ( "pending send" ) ;
251
+ return Ok ( DecodeResult :: Some {
252
+ read : 0 ,
253
+ new_state : self . state . clone ( ) ,
254
+ new_pos : pos . clone ( ) ,
255
+ buffer ,
256
+ pending : true ,
257
+ } ) ;
248
258
}
249
259
}
260
+
250
261
Ok ( DecodeResult :: Some {
251
262
read : 0 ,
252
263
new_state : State :: Done ,
@@ -520,10 +531,10 @@ mod tests {
520
531
let trailer = decoder. trailer ( ) . recv ( ) . await ;
521
532
assert_eq ! (
522
533
trailer,
523
- Some ( (
534
+ Some ( vec! [ (
524
535
"Expires" . parse( ) . unwrap( ) ,
525
536
"Wed, 21 Oct 2015 07:28:00 GMT" . parse( ) . unwrap( ) ,
526
- ) )
537
+ ) ] )
527
538
) ;
528
539
} ) ;
529
540
}
0 commit comments