refactor(http1): notice eof in the try_keep_alive method
This commit is contained in:
		| @@ -239,7 +239,9 @@ where I: AsyncRead + AsyncWrite + Unpin, | ||||
|     pub fn poll_read_keep_alive(&mut self, cx: &mut task::Context<'_>) -> Poll<crate::Result<()>> { | ||||
|         debug_assert!(!self.can_read_head() && !self.can_read_body()); | ||||
|  | ||||
|         if self.is_mid_message() { | ||||
|         if self.is_read_closed() { | ||||
|             Poll::Pending | ||||
|         } else if self.is_mid_message() { | ||||
|             self.mid_message_detect_eof(cx) | ||||
|         } else { | ||||
|             self.require_empty_read(cx) | ||||
| @@ -258,7 +260,7 @@ where I: AsyncRead + AsyncWrite + Unpin, | ||||
|     // This should only be called for Clients wanting to enter the idle | ||||
|     // state. | ||||
|     fn require_empty_read(&mut self, cx: &mut task::Context<'_>) -> Poll<crate::Result<()>> { | ||||
|         debug_assert!(!self.can_read_head() && !self.can_read_body()); | ||||
|         debug_assert!(!self.can_read_head() && !self.can_read_body() && !self.is_read_closed()); | ||||
|         debug_assert!(!self.is_mid_message()); | ||||
|         debug_assert!(T::is_client()); | ||||
|  | ||||
| @@ -288,17 +290,13 @@ where I: AsyncRead + AsyncWrite + Unpin, | ||||
|     } | ||||
|  | ||||
|     fn mid_message_detect_eof(&mut self, cx: &mut task::Context<'_>) -> Poll<crate::Result<()>> { | ||||
|         debug_assert!(!self.can_read_head() && !self.can_read_body()); | ||||
|         debug_assert!(!self.can_read_head() && !self.can_read_body() && !self.is_read_closed()); | ||||
|         debug_assert!(self.is_mid_message()); | ||||
|  | ||||
|         if self.state.allow_half_close || !self.io.read_buf().is_empty() { | ||||
|             return Poll::Pending; | ||||
|         } | ||||
|  | ||||
|         if self.state.is_read_closed() { | ||||
|             return Poll::Ready(Err(crate::Error::new_incomplete())); | ||||
|         } | ||||
|  | ||||
|         let num_read = ready!(self.force_io_read(cx)).map_err(crate::Error::new_io)?; | ||||
|  | ||||
|         if num_read == 0 { | ||||
| @@ -347,7 +345,17 @@ where I: AsyncRead + AsyncWrite + Unpin, | ||||
|         if !self.io.is_read_blocked() { | ||||
|             if self.io.read_buf().is_empty() { | ||||
|                 match self.io.poll_read_from_io(cx) { | ||||
|                     Poll::Ready(Ok(_)) => (), | ||||
|                     Poll::Ready(Ok(n)) => { | ||||
|                         if n == 0 { | ||||
|                             trace!("maybe_notify; read eof"); | ||||
|                             if self.state.is_idle() { | ||||
|                                 self.state.close(); | ||||
|                             } else { | ||||
|                                 self.close_read() | ||||
|                             } | ||||
|                             return; | ||||
|                         } | ||||
|                     }, | ||||
|                     Poll::Pending => { | ||||
|                         trace!("maybe_notify; read_from_io blocked"); | ||||
|                         return | ||||
| @@ -355,6 +363,7 @@ where I: AsyncRead + AsyncWrite + Unpin, | ||||
|                     Poll::Ready(Err(e)) => { | ||||
|                         trace!("maybe_notify; read_from_io error: {}", e); | ||||
|                         self.state.close(); | ||||
|                         self.state.error = Some(crate::Error::new_io(e)); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| @@ -716,6 +725,10 @@ impl fmt::Debug for State { | ||||
|             builder.field("error", error); | ||||
|         } | ||||
|  | ||||
|         if self.allow_half_close { | ||||
|             builder.field("allow_half_close", &true); | ||||
|         } | ||||
|  | ||||
|         // Purposefully leaving off other fields.. | ||||
|  | ||||
|         builder.finish() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user