fix(http): Handle readable in keep-alive
It's possible that a connection will be closed and the only way to find out is by doing a read. The keep-alive state (State::Init + Next_::Wait) now tries to read on readable. In the case of EOF, it returns state closed. If bytes are actually available, it's a connection error, and the connection is closed. Otherwise, it's just a spurious wakeup.
This commit is contained in:
		| @@ -236,6 +236,29 @@ impl<K: Key, T: Transport, H: MessageHandler<T>> ConnInner<K, T, H> { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|  |             State::Init { interest: Next_::Wait, .. } => { | ||||||
|  |                 match self.buf.read_from(&mut self.transport) { | ||||||
|  |                     Ok(0) => { | ||||||
|  |                         // End-of-file; connection was closed by peer | ||||||
|  |                         State::Closed | ||||||
|  |                     }, | ||||||
|  |                     Ok(n) => { | ||||||
|  |                         // Didn't expect bytes here! Close the connection. | ||||||
|  |                         warn!("read {} bytes in State::Init with Wait interest", n); | ||||||
|  |                         State::Closed | ||||||
|  |                     }, | ||||||
|  |                     Err(e) => match e.kind() { | ||||||
|  |                         io::ErrorKind::WouldBlock => { | ||||||
|  |                             // This is the expected case reading in this state | ||||||
|  |                             state | ||||||
|  |                         }, | ||||||
|  |                         _ => { | ||||||
|  |                             warn!("socket error reading State::Init with Wait interest: {}", e); | ||||||
|  |                             State::Closed | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|             State::Init { .. } => { |             State::Init { .. } => { | ||||||
|                 trace!("on_readable State::{:?}", state); |                 trace!("on_readable State::{:?}", state); | ||||||
|                 state |                 state | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user