@@ -11,6 +11,7 @@ use bytes::{Buf, Bytes};
11
11
use futures_util:: ready;
12
12
use http:: header:: { HeaderValue , CONNECTION , TE } ;
13
13
use http:: { HeaderMap , Method , Version } ;
14
+ use http_body:: Frame ;
14
15
use httparse:: ParserConfig ;
15
16
16
17
use super :: io:: Buffered ;
@@ -268,10 +269,20 @@ where
268
269
self . try_keep_alive ( cx) ;
269
270
}
270
271
} else if msg. expect_continue && msg. head . version . gt ( & Version :: HTTP_10 ) {
271
- self . state . reading = Reading :: Continue ( Decoder :: new ( msg. decode ) ) ;
272
+ let h1_max_header_size = None ; // TODO: remove this when we land h1_max_header_size support
273
+ self . state . reading = Reading :: Continue ( Decoder :: new (
274
+ msg. decode ,
275
+ self . state . h1_max_headers ,
276
+ h1_max_header_size,
277
+ ) ) ;
272
278
wants = wants. add ( Wants :: EXPECT ) ;
273
279
} else {
274
- self . state . reading = Reading :: Body ( Decoder :: new ( msg. decode ) ) ;
280
+ let h1_max_header_size = None ; // TODO: remove this when we land h1_max_header_size support
281
+ self . state . reading = Reading :: Body ( Decoder :: new (
282
+ msg. decode ,
283
+ self . state . h1_max_headers ,
284
+ h1_max_header_size,
285
+ ) ) ;
275
286
}
276
287
277
288
self . state . allow_trailer_fields = msg
@@ -312,33 +323,41 @@ where
312
323
pub ( crate ) fn poll_read_body (
313
324
& mut self ,
314
325
cx : & mut Context < ' _ > ,
315
- ) -> Poll < Option < io:: Result < Bytes > > > {
326
+ ) -> Poll < Option < io:: Result < Frame < Bytes > > > > {
316
327
debug_assert ! ( self . can_read_body( ) ) ;
317
328
318
329
let ( reading, ret) = match self . state . reading {
319
330
Reading :: Body ( ref mut decoder) => {
320
331
match ready ! ( decoder. decode( cx, & mut self . io) ) {
321
- Ok ( slice) => {
322
- let ( reading, chunk) = if decoder. is_eof ( ) {
323
- debug ! ( "incoming body completed" ) ;
324
- (
325
- Reading :: KeepAlive ,
326
- if !slice. is_empty ( ) {
327
- Some ( Ok ( slice) )
328
- } else {
329
- None
330
- } ,
331
- )
332
- } else if slice. is_empty ( ) {
333
- error ! ( "incoming body unexpectedly ended" ) ;
334
- // This should be unreachable, since all 3 decoders
335
- // either set eof=true or return an Err when reading
336
- // an empty slice...
337
- ( Reading :: Closed , None )
332
+ Ok ( frame) => {
333
+ if frame. is_data ( ) {
334
+ let slice = frame. data_ref ( ) . unwrap_or_else ( || unreachable ! ( ) ) ;
335
+ let ( reading, maybe_frame) = if decoder. is_eof ( ) {
336
+ debug ! ( "incoming body completed" ) ;
337
+ (
338
+ Reading :: KeepAlive ,
339
+ if !slice. is_empty ( ) {
340
+ Some ( Ok ( frame) )
341
+ } else {
342
+ None
343
+ } ,
344
+ )
345
+ } else if slice. is_empty ( ) {
346
+ error ! ( "incoming body unexpectedly ended" ) ;
347
+ // This should be unreachable, since all 3 decoders
348
+ // either set eof=true or return an Err when reading
349
+ // an empty slice...
350
+ ( Reading :: Closed , None )
351
+ } else {
352
+ return Poll :: Ready ( Some ( Ok ( frame) ) ) ;
353
+ } ;
354
+ ( reading, Poll :: Ready ( maybe_frame) )
355
+ } else if frame. is_trailers ( ) {
356
+ ( Reading :: Closed , Poll :: Ready ( Some ( Ok ( frame) ) ) )
338
357
} else {
339
- return Poll :: Ready ( Some ( Ok ( slice ) ) ) ;
340
- } ;
341
- ( reading , Poll :: Ready ( chunk ) )
358
+ trace ! ( "discarding unknown frame" ) ;
359
+ ( Reading :: Closed , Poll :: Ready ( None ) )
360
+ }
342
361
}
343
362
Err ( e) => {
344
363
debug ! ( "incoming body decode error: {}" , e) ;
0 commit comments