@@ -47,6 +47,35 @@ where I: AsyncRead + AsyncWrite,
4747 }
4848 }
4949
50+
51+ fn poll2 ( & mut self ) -> Poll < Option < Frame < http:: MessageHead < T :: Incoming > , http:: Chunk , :: Error > > , io:: Error > {
52+ trace ! ( "Conn::poll()" ) ;
53+
54+ loop {
55+ if self . is_read_closed ( ) {
56+ trace ! ( "Conn::poll when closed" ) ;
57+ return Ok ( Async :: Ready ( None ) ) ;
58+ } else if self . can_read_head ( ) {
59+ return self . read_head ( ) ;
60+ } else if self . can_write_continue ( ) {
61+ try_nb ! ( self . flush( ) ) ;
62+ } else if self . can_read_body ( ) {
63+ return self . read_body ( )
64+ . map ( |async| async . map ( |chunk| Some ( Frame :: Body {
65+ chunk : chunk
66+ } ) ) )
67+ . or_else ( |err| {
68+ self . state . close_read ( ) ;
69+ Ok ( Async :: Ready ( Some ( Frame :: Error { error : err. into ( ) } ) ) )
70+ } ) ;
71+ } else {
72+ trace ! ( "poll when on keep-alive" ) ;
73+ self . maybe_park_read ( ) ;
74+ return Ok ( Async :: NotReady ) ;
75+ }
76+ }
77+ }
78+
5079 fn is_read_closed ( & self ) -> bool {
5180 self . state . is_read_closed ( )
5281 }
@@ -89,12 +118,9 @@ where I: AsyncRead + AsyncWrite,
89118 self . state . close_read ( ) ;
90119 self . io . consume_leading_lines ( ) ;
91120 let was_mid_parse = !self . io . read_buf ( ) . is_empty ( ) ;
92- return if was_mid_parse {
121+ return if was_mid_parse || must_respond_with_error {
93122 debug ! ( "parse error ({}) with {} bytes" , e, self . io. read_buf( ) . len( ) ) ;
94123 Ok ( Async :: Ready ( Some ( Frame :: Error { error : e } ) ) )
95- } else if must_respond_with_error {
96- trace ! ( "parse error with 0 input, err = {:?}" , e) ;
97- Ok ( Async :: Ready ( Some ( Frame :: Error { error : e } ) ) )
98124 } else {
99125 debug ! ( "read eof" ) ;
100126 Ok ( Async :: Ready ( None ) )
@@ -379,32 +405,12 @@ where I: AsyncRead + AsyncWrite,
379405 type Item = Frame < http:: MessageHead < T :: Incoming > , http:: Chunk , :: Error > ;
380406 type Error = io:: Error ;
381407
408+ #[ inline]
382409 fn poll ( & mut self ) -> Poll < Option < Self :: Item > , Self :: Error > {
383- trace ! ( "Conn::poll()" ) ;
384-
385- loop {
386- if self . is_read_closed ( ) {
387- trace ! ( "Conn::poll when closed" ) ;
388- return Ok ( Async :: Ready ( None ) ) ;
389- } else if self . can_read_head ( ) {
390- return self . read_head ( ) ;
391- } else if self . can_write_continue ( ) {
392- try_nb ! ( self . flush( ) ) ;
393- } else if self . can_read_body ( ) {
394- return self . read_body ( )
395- . map ( |async| async . map ( |chunk| Some ( Frame :: Body {
396- chunk : chunk
397- } ) ) )
398- . or_else ( |err| {
399- self . state . close_read ( ) ;
400- Ok ( Async :: Ready ( Some ( Frame :: Error { error : err. into ( ) } ) ) )
401- } ) ;
402- } else {
403- trace ! ( "poll when on keep-alive" ) ;
404- self . maybe_park_read ( ) ;
405- return Ok ( Async :: NotReady ) ;
406- }
407- }
410+ self . poll2 ( ) . map_err ( |err| {
411+ debug ! ( "poll error: {}" , err) ;
412+ err
413+ } )
408414 }
409415}
410416
@@ -460,16 +466,22 @@ where I: AsyncRead + AsyncWrite,
460466
461467 }
462468
469+ #[ inline]
463470 fn poll_complete( & mut self ) -> Poll < ( ) , Self :: SinkError > {
464471 trace ! ( "Conn::poll_complete()" ) ;
465- let ret = self . flush( ) ;
466- trace ! ( "Conn::flush = {:?}" , ret) ;
467- ret
472+ self . flush( ) . map_err( |err| {
473+ debug ! ( "error writing: {}" , err) ;
474+ err
475+ } )
468476 }
469477
478+ #[ inline]
470479 fn close( & mut self ) -> Poll < ( ) , Self :: SinkError > {
471480 try_ready ! ( self . poll_complete( ) ) ;
472- self . io. io_mut( ) . shutdown( )
481+ self . io. io_mut( ) . shutdown( ) . map_err( |err| {
482+ debug ! ( "error closing: {}" , err) ;
483+ err
484+ } )
473485 }
474486}
475487
0 commit comments