QoL connection management

This commit is contained in:
Quentin 2024-01-24 17:50:03 +01:00
parent f9d6c1c927
commit c1bab5808b
Signed by: quentin
GPG key ID: E9602264D639FF68

View file

@ -82,7 +82,7 @@ impl AuthServer {
}; };
tracing::info!("AUTH: accepted connection from {}", remote_addr); tracing::info!("AUTH: accepted connection from {}", remote_addr);
let conn = tokio::spawn(NetLoop::new(socket).run_error()); let conn = tokio::spawn(NetLoop::new(socket, must_exit.clone()).run_error());
connections.push(conn); connections.push(conn);
@ -98,12 +98,14 @@ impl AuthServer {
struct NetLoop { struct NetLoop {
stream: BufStream<TcpStream>, stream: BufStream<TcpStream>,
stop: watch::Receiver<bool>,
} }
impl NetLoop { impl NetLoop {
fn new(stream: TcpStream) -> Self{ fn new(stream: TcpStream, stop: watch::Receiver<bool>) -> Self {
Self { Self {
stream: BufStream::new(stream), stream: BufStream::new(stream),
stop,
} }
} }
@ -118,9 +120,21 @@ impl NetLoop {
let mut buff: Vec<u8> = Vec::new(); let mut buff: Vec<u8> = Vec::new();
loop { loop {
buff.clear(); buff.clear();
self.stream.read_until(b'\n', &mut buff).await?; tokio::select! {
read_res = self.stream.read_until(b'\n', &mut buff) => {
let bread = read_res?;
if bread == 0 {
tracing::info!("Reading buffer empty, connection has been closed. Exiting AUTH session.");
return Ok(())
}
let (input, cmd) = client_command(&buff).map_err(|_| anyhow!("Unable to parse command"))?; let (input, cmd) = client_command(&buff).map_err(|_| anyhow!("Unable to parse command"))?;
println!("input: {:?}, cmd: {:?}", input, cmd); println!("input: {:?}, cmd: {:?}", input, cmd);
},
_ = self.stop.changed() => {
tracing::debug!("Server is stopping, quitting this runner");
return Ok(())
}
}
} }
} }
} }