@@ -37,18 +37,18 @@ where
3737 R : Debug ,
3838 W : Debug ,
3939{
40- framed_read : FramedRead < R , RequestDecoder > ,
40+ framed_read : Option < FramedRead < R , RequestDecoder > > ,
4141 message_writer : MessageWriter < W > ,
4242}
4343
4444impl < R , W > HttpConnection < R , W >
4545where
46- R : AsyncRead + Unpin + Debug ,
46+ R : AsyncRead + Unpin + Send + Debug ,
4747 W : AsyncWrite + Unpin + Debug ,
4848{
4949 pub fn new ( reader : R , writer : W ) -> Self {
5050 Self {
51- framed_read : FramedRead :: with_capacity ( reader, RequestDecoder :: new ( ) , 8 * 1024 ) ,
51+ framed_read : Some ( FramedRead :: with_capacity ( reader, RequestDecoder :: new ( ) , 8 * 1024 ) ) ,
5252 message_writer : MessageWriter :: with_capacity ( writer, 8 * 1024 ) ,
5353 }
5454 }
6060 <H :: RespBody as Body >:: Error : Display ,
6161 {
6262 loop {
63- match self . framed_read . next ( ) . await {
63+ let framed_read = self . framed_read . as_mut ( ) . expect ( "framed reader must be available while processing requests" ) ;
64+
65+ match framed_read. next ( ) . await {
6466 Some ( Ok ( Message :: Header ( ( header, payload_size) ) ) ) => {
6567 self . do_process ( header, payload_size, handler) . await ?;
6668 }
@@ -112,19 +114,14 @@ where
112114 }
113115 }
114116
115- let ( req_body, maybe_body_sender) = ReqBody :: create_req_body ( & mut self . framed_read , payload_size) ;
117+ let framed_read = self . framed_read . take ( ) . expect ( "framed reader must exist when creating request body" ) ;
118+ let ( req_body, req_body_state) = ReqBody :: create_req_body ( framed_read, payload_size) ;
116119 let request = header. body ( req_body) ;
117120
118- let response_result = match maybe_body_sender {
119- None => handler. call ( request) . await ,
120- Some ( mut body_sender) => {
121- let ( handler_result, body_send_result) = tokio:: join!( handler. call( request) , body_sender. start( ) ) ;
121+ let response_result = handler. call ( request) . await ;
122122
123- // check if body sender has error
124- body_send_result?;
125- handler_result
126- }
127- } ;
123+ let framed_read = req_body_state. finish ( ) . await ?;
124+ self . framed_read = Some ( framed_read) ;
128125
129126 self . send_response ( response_result) . await
130127 }
@@ -152,15 +149,8 @@ where
152149 {
153150 let ( header_parts, mut body) = response. into_parts ( ) ;
154151
155- let payload_size = {
156- let size_hint = body. size_hint ( ) ;
157- match size_hint. exact ( ) {
158- Some ( 0 ) => PayloadSize :: Empty ,
159- Some ( length) => PayloadSize :: Length ( length) ,
160- None => PayloadSize :: Chunked ,
161- }
162- } ;
163-
152+ let payload_size: PayloadSize = body. size_hint ( ) . into ( ) ;
153+
164154 let header = Message :: < _ , T :: Data > :: Header ( ( ResponseHead :: from_parts ( header_parts, ( ) ) , payload_size) ) ;
165155
166156 self . message_writer . write ( header) ?;
0 commit comments