aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/network
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-03-30 14:18:18 +0200
committerGustav Sörnäs <gustav@sornas.net>2021-03-30 15:25:56 +0200
commit80dba403ed968982ec23ab7416d48dc5b69329f6 (patch)
tree1d1a84d120d48e125f18123c4b43279fe04c3494 /mumd/src/network
parent7d8a29b8228e21270fce53783a371317b356ebf7 (diff)
downloadmum-80dba403ed968982ec23ab7416d48dc5b69329f6.tar.gz
return tcp errors from tcp internals
Diffstat (limited to 'mumd/src/network')
-rw-r--r--mumd/src/network/tcp.rs42
1 files changed, 22 insertions, 20 deletions
diff --git a/mumd/src/network/tcp.rs b/mumd/src/network/tcp.rs
index 09cd844..6460cba 100644
--- a/mumd/src/network/tcp.rs
+++ b/mumd/src/network/tcp.rs
@@ -1,3 +1,4 @@
+use crate::error::TcpError;
use crate::network::ConnectionInfo;
use crate::state::{State, StatePhase};
use log::*;
@@ -84,7 +85,7 @@ pub async fn handle(
packet_sender: mpsc::UnboundedSender<ControlPacket<Serverbound>>,
mut packet_receiver: mpsc::UnboundedReceiver<ControlPacket<Serverbound>>,
mut tcp_event_register_receiver: mpsc::UnboundedReceiver<(TcpEvent, TcpEventCallback)>,
-) {
+) -> Result<(), TcpError> {
loop {
let connection_info = 'data: loop {
while connection_info_receiver.changed().await.is_ok() {
@@ -92,20 +93,20 @@ pub async fn handle(
break 'data data;
}
}
- return;
+ return Err(TcpError::NoConnectionInfoReceived);
};
let (mut sink, stream) = connect(
connection_info.socket_addr,
connection_info.hostname,
connection_info.accept_invalid_cert,
)
- .await;
+ .await?;
// Handshake (omitting `Version` message for brevity)
let state_lock = state.lock().await;
let username = state_lock.username().unwrap().to_string();
let password = state_lock.password().map(|x| x.to_string());
- authenticate(&mut sink, username, password).await;
+ authenticate(&mut sink, username, password).await?;
let phase_watcher = state_lock.phase_receiver();
let input_receiver = state_lock.audio().input_receiver();
drop(state_lock);
@@ -115,6 +116,7 @@ pub async fn handle(
run_until(
|phase| matches!(phase, StatePhase::Disconnected),
+ //TODO take out the errors here and return them
join5(
send_pings(packet_sender.clone(), 10),
listen(
@@ -144,62 +146,62 @@ async fn connect(
server_addr: SocketAddr,
server_host: String,
accept_invalid_cert: bool,
-) -> (TcpSender, TcpReceiver) {
- let stream = TcpStream::connect(&server_addr)
- .await
- .expect("failed to connect to server:");
+) -> Result<(TcpSender, TcpReceiver), TcpError> {
+ let stream = TcpStream::connect(&server_addr).await?;
debug!("TCP connected");
let mut builder = native_tls::TlsConnector::builder();
builder.danger_accept_invalid_certs(accept_invalid_cert);
let connector: TlsConnector = builder
.build()
- .expect("failed to create TLS connector")
+ .map_err(|e| TcpError::TlsConnectorBuilderError(e))?
.into();
let tls_stream = connector
.connect(&server_host, stream)
.await
- .expect("failed to connect TLS: {}");
+ .map_err(|e| TcpError::TlsConnectError(e))?;
debug!("TLS connected");
// Wrap the TLS stream with Mumble's client-side control-channel codec
- ClientControlCodec::new().framed(tls_stream).split()
+ Ok(ClientControlCodec::new().framed(tls_stream).split())
}
async fn authenticate(
sink: &mut TcpSender,
username: String,
password: Option<String>
-) {
+) -> Result<(), TcpError> {
let mut msg = msgs::Authenticate::new();
msg.set_username(username);
if let Some(password) = password {
msg.set_password(password);
}
msg.set_opus(true);
- sink.send(msg.into()).await.unwrap(); //TODO handle panic
+ sink.send(msg.into()).await?;
+ Ok(())
}
async fn send_pings(
packet_sender: mpsc::UnboundedSender<ControlPacket<Serverbound>>,
delay_seconds: u64,
-) {
+) -> Result<(), TcpError> {
let mut interval = time::interval(Duration::from_secs(delay_seconds));
loop {
interval.tick().await;
trace!("Sending TCP ping");
let msg = msgs::Ping::new();
- packet_sender.send(msg.into()).unwrap(); //TODO handle panic
+ packet_sender.send(msg.into())?;
}
}
async fn send_packets(
mut sink: TcpSender,
packet_receiver: &mut mpsc::UnboundedReceiver<ControlPacket<Serverbound>>,
-) {
+) -> Result<(), TcpError> {
loop {
- let packet = packet_receiver.recv().await.unwrap(); //TODO handle panic
- sink.send(packet).await.unwrap(); //TODO handle panic
+ // Safe since we always have at least one sender alive.
+ let packet = packet_receiver.recv().await.unwrap();
+ sink.send(packet).await?;
}
}
@@ -226,9 +228,9 @@ async fn send_voice(
.await
.next()
.await
- .unwrap()
+ .unwrap() //TODO handle panic
.into())
- .unwrap();
+ .unwrap(); //TODO handle panic
}
},
inner_phase_watcher.clone(),