Close the client side when the upstream closes, in inferproxy

Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
This commit is contained in:
2026-09-18 16:07:45 -07:00
parent 58c7738721
commit 1faa38be44
3 changed files with 62 additions and 14 deletions
+19 -13
View File
@@ -108,28 +108,34 @@ pub fn serve(listener: UnixListener, upstream: String, limits: Limits) -> io::Re
}
fn handle(client: UnixStream, upstream: String, open: Arc<AtomicUsize>) {
let _guard = OpenGuard::new(open);
let server = match TcpStream::connect(&upstream) {
Ok(s) => s,
Err(_) => return,
};
let _ = forward(&client, &server);
drop(_guard);
let c2s = {
let _guard = OpenGuard::new(open);
match forward(&client, &server) {
Ok(c2s) => c2s,
Err(_) => return,
}
};
let _ = client.shutdown(Shutdown::Both);
let _ = server.shutdown(Shutdown::Both);
let _ = c2s.join();
}
fn forward(client: &UnixStream, server: &TcpStream) -> io::Result<()> {
fn forward(client: &UnixStream, server: &TcpStream) -> io::Result<thread::JoinHandle<()>> {
let mut c2s_in = client.try_clone()?;
let mut s2c_out = client.try_clone()?;
let mut s2c_in = server.try_clone()?;
let mut c2s_out = server.try_clone()?;
thread::scope(|s| {
s.spawn(move || {
let _ = copy(&mut c2s_in, &mut c2s_out);
let _ = c2s_out.shutdown(Shutdown::Write);
});
s.spawn(move || {
let _ = copy(&mut s2c_in, &mut s2c_out);
});
let c2s = thread::spawn(move || {
let _ = copy(&mut c2s_in, &mut c2s_out);
let _ = c2s_out.shutdown(Shutdown::Write);
});
Ok(())
let _ = thread::spawn(move || {
let _ = copy(&mut s2c_in, &mut s2c_out);
})
.join();
Ok(c2s)
}