in src/core/admin/src/lib.rs [299:355]
fn read(&mut self, token: Token) -> Result<()> {
let session = self
.sessions
.get_mut(token.0)
.ok_or_else(|| Error::new(ErrorKind::Other, "non-existant session"))?;
// fill the session
match session.fill() {
Ok(0) => Err(Error::new(ErrorKind::Other, "client hangup")),
r => r,
}?;
match session.receive() {
Ok(request) => {
ADMIN_REQUEST_PARSE.increment();
// do some request handling
match request {
AdminRequest::FlushAll => {
let _ = self.signal_queue_tx.try_send_all(Signal::FlushAll);
session.send(AdminResponse::Ok)?;
}
AdminRequest::Quit => {
return Err(Error::new(ErrorKind::Other, "should hangup"));
}
AdminRequest::Stats => {
session.send(AdminResponse::Stats)?;
}
AdminRequest::Version => {
session.send(AdminResponse::version(self.version.clone()))?;
}
}
ADMIN_RESPONSE_COMPOSE.increment();
match session.flush() {
Ok(_) => Ok(()),
Err(e) => map_err(e),
}?;
if session.write_pending() > 0 || session.remaining() > 0 {
let interest = session.interest();
if session
.reregister(self.poll.registry(), token, interest)
.is_err()
{
return Err(Error::new(ErrorKind::Other, "failed to reregister"));
}
}
Ok(())
}
Err(e) => match e.kind() {
ErrorKind::WouldBlock => Ok(()),
_ => Err(e),
},
}
}