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"), } } }); 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(()),