From 06d2cdef7802db7362f425f389144e4d73ffb831 Mon Sep 17 00:00:00 2001 From: Alexey <247128645+axkurcom@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:12:19 +0300 Subject: [PATCH 1/2] ME Connection lost fixes --- src/main.rs | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7c30aab..a9b0e0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -940,42 +940,39 @@ match crate::transport::middle_proxy::fetch_proxy_secret(proxy_secret_path).awai .run() .await { - let peer_closed = match &e { - crate::error::ProxyError::Io(ioe) => { - matches!( + let peer_closed = matches!( + &e, + crate::error::ProxyError::Io(ioe) + if matches!( ioe.kind(), std::io::ErrorKind::ConnectionReset | std::io::ErrorKind::ConnectionAborted | std::io::ErrorKind::BrokenPipe | std::io::ErrorKind::NotConnected ) - } + ) || matches!( + &e, crate::error::ProxyError::Stream( - crate::error::StreamError::Io(ioe), - ) => { - matches!( + crate::error::StreamError::Io(ioe) + ) + if matches!( ioe.kind(), std::io::ErrorKind::ConnectionReset | std::io::ErrorKind::ConnectionAborted | std::io::ErrorKind::BrokenPipe | std::io::ErrorKind::NotConnected ) - } - _ => false, - }; + ); - if peer_closed { - debug!( - peer = %peer_addr, - error = %e, - "Connection closed by peer" - ); - } else { - warn!( - peer = %peer_addr, - error = %e, - "Connection closed with error" - ); + let me_closed = matches!( + &e, + crate::error::ProxyError::Proxy(msg) if msg == "ME connection lost" + ); + + match (peer_closed, me_closed) { + (true, _) => debug!(peer = %peer_addr, error = %e, "Connection closed by client"), + (_, true) => warn!(peer = %peer_addr, error = %e, "Connection closed: Middle-End dropped session"), + _ => warn!(peer = %peer_addr, error = %e, "Connection closed with error"), } } }); From 3ab56f55e93ed7506f87181ea50a65dab490c6c6 Mon Sep 17 00:00:00 2001 From: Alexey <247128645+axkurcom@users.noreply.github.com> Date: Sat, 21 Feb 2026 16:28:47 +0300 Subject: [PATCH 2/2] ME Connection error handling --- src/proxy/middle_relay.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/proxy/middle_relay.rs b/src/proxy/middle_relay.rs index 2a17e7e..0735d01 100644 --- a/src/proxy/middle_relay.rs +++ b/src/proxy/middle_relay.rs @@ -98,6 +98,7 @@ where }); let mut main_result: Result<()> = Ok(()); + let mut client_closed = false; loop { match read_client_payload(&mut crypto_reader, proto_tag, frame_limit, &user).await { Ok(Some((payload, quickack))) => { @@ -124,6 +125,7 @@ where } Ok(None) => { debug!(conn_id, "Client EOF"); + client_closed = true; let _ = me_pool.send_close(conn_id).await; break; } @@ -135,7 +137,19 @@ where } let _ = stop_tx.send(()); - let writer_result = me_writer.await.unwrap_or_else(|e| Err(ProxyError::Proxy(format!("ME writer join error: {e}")))); + let mut writer_result = me_writer + .await + .unwrap_or_else(|e| Err(ProxyError::Proxy(format!("ME writer join error: {e}")))); + + // When client closes, but ME channel stopped as unregistered - it isnt error + if client_closed { + if matches!( + writer_result, + Err(ProxyError::Proxy(ref msg)) if msg == "ME connection lost" + ) { + writer_result = Ok(()); + } + } let result = match (main_result, writer_result) { (Ok(()), Ok(())) => Ok(()),