From 2a9f6e24a95acaa671093d02bf108e9d9c9db125 Mon Sep 17 00:00:00 2001 From: Nate Finch Date: Wed, 30 Sep 2026 20:59:08 -0400 Subject: [PATCH] make Stream.is_closing() return True once the server is gone Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0822dee1-89da-4338-994f-bf1a11052c0e --- CHANGELOG.md | 1 + mitmproxy-rs/src/stream.rs | 25 +++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82d789c8..2a5f7dbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## Unreleased: mitmproxy_rs next - Preserve OS error details when UDP and WireGuard servers fail to start. +- `Stream.is_closing()` now returns `True` once the server or UDP client task has shut down. ## 20 July 2026: mitmproxy_rs 0.12.11 diff --git a/mitmproxy-rs/src/stream.rs b/mitmproxy-rs/src/stream.rs index f22e8433..cfe32efe 100644 --- a/mitmproxy-rs/src/stream.rs +++ b/mitmproxy-rs/src/stream.rs @@ -127,10 +127,10 @@ impl Stream { } } - /// Check whether this stream is being closed. + /// Check whether this stream is being closed or the server has been shut down. fn is_closing(&self) -> bool { match self.state { - StreamState::Open => false, + StreamState::Open => self.command_tx.is_closed(), StreamState::HalfClosed | StreamState::Closed => true, } } @@ -207,3 +207,24 @@ impl Drop for Stream { self.close().ok(); } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn is_closing_when_server_shut_down() { + let (command_tx, command_rx) = mpsc::unbounded_channel(); + let stream = Stream { + connection_id: ConnectionId::unassigned_udp(), + state: StreamState::Open, + command_tx, + peername: "127.0.0.1:1234".parse().unwrap(), + sockname: "127.0.0.1:4321".parse().unwrap(), + tunnel_info: TunnelInfo::None, + }; + assert!(!stream.is_closing()); + drop(command_rx); + assert!(stream.is_closing()); + } +}