From 65d1c1bf8ed9073b7d409d222c0648912ee80f97 Mon Sep 17 00:00:00 2001 From: Konstantin Seiler Date: Wed, 29 Jan 2020 09:45:06 +1100 Subject: [PATCH] Proper error handling when connecting to the server. --- core/src/connection/mod.rs | 22 ++++++++++++++++++-- src/main.rs | 42 ++++++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/core/src/connection/mod.rs b/core/src/connection/mod.rs index 5f9b3dc..7249779 100644 --- a/core/src/connection/mod.rs +++ b/core/src/connection/mod.rs @@ -28,9 +28,27 @@ pub fn connect( let (addr, connect_url) = match *proxy { Some(ref url) => { info!("Using proxy \"{}\"", url); - (url.to_socket_addrs().unwrap().next().unwrap(), Some(addr)) + match url.to_socket_addrs().and_then(|mut iter| { + iter.next().ok_or(io::Error::new( + io::ErrorKind::NotFound, + "Can't resolve proxy server address", + )) + }) { + Ok(socket_addr) => (socket_addr, Some(addr)), + Err(error) => return Box::new(futures::future::err(error)), + } + } + None => { + match addr.to_socket_addrs().and_then(|mut iter| { + iter.next().ok_or(io::Error::new( + io::ErrorKind::NotFound, + "Can't resolve server address", + )) + }) { + Ok(socket_addr) => (socket_addr, None), + Err(error) => return Box::new(futures::future::err(error)), + } } - None => (addr.to_socket_addrs().unwrap().next().unwrap(), None), }; let socket = TcpStream::connect(&addr, handle); diff --git a/src/main.rs b/src/main.rs index 9f41f2c..4a74d22 100644 --- a/src/main.rs +++ b/src/main.rs @@ -460,27 +460,33 @@ impl Future for Main { progress = true; } - if let Async::Ready(session) = self.connect.poll().unwrap() { - self.connect = Box::new(futures::future::empty()); - let mixer_config = self.mixer_config.clone(); - let mixer = (self.mixer)(Some(mixer_config)); - let player_config = self.player_config.clone(); - let connect_config = self.connect_config.clone(); + match self.connect.poll() { + Ok(Async::Ready(session)) => { + self.connect = Box::new(futures::future::empty()); + let mixer_config = self.mixer_config.clone(); + let mixer = (self.mixer)(Some(mixer_config)); + let player_config = self.player_config.clone(); + let connect_config = self.connect_config.clone(); - let audio_filter = mixer.get_audio_filter(); - let backend = self.backend; - let device = self.device.clone(); - let (player, event_channel) = - Player::new(player_config, session.clone(), audio_filter, move || { - (backend)(device) - }); + let audio_filter = mixer.get_audio_filter(); + let backend = self.backend; + let device = self.device.clone(); + let (player, event_channel) = + Player::new(player_config, session.clone(), audio_filter, move || { + (backend)(device) + }); - let (spirc, spirc_task) = Spirc::new(connect_config, session, player, mixer); - self.spirc = Some(spirc); - self.spirc_task = Some(spirc_task); - self.player_event_channel = Some(event_channel); + let (spirc, spirc_task) = Spirc::new(connect_config, session, player, mixer); + self.spirc = Some(spirc); + self.spirc_task = Some(spirc_task); + self.player_event_channel = Some(event_channel); - progress = true; + progress = true; + } + Ok(Async::NotReady) => (), + Err(_) => { + self.connect = Box::new(futures::future::empty()); + } } if let Async::Ready(Some(())) = self.signal.poll().unwrap() {