diff options
| author | Linus Färnstrand <linus@mullvad.net> | 2017-04-05 14:10:02 +0200 |
|---|---|---|
| committer | Erik Larkö <erik@mullvad.net> | 2017-04-07 13:08:25 +0800 |
| commit | cec08d90d944ed819f97db65533ea370e47bbf6f (patch) | |
| tree | 2f60d5701acbe88903ca2dd8a6c8226146f86b83 | |
| parent | b527821174cde1de5123ae3d0e6827639522a44c (diff) | |
| download | mullvadvpn-cec08d90d944ed819f97db65533ea370e47bbf6f.tar.xz mullvadvpn-cec08d90d944ed819f97db65533ea370e47bbf6f.zip | |
Put all chain_err on level. Return last error
| -rw-r--r-- | talpid_ipc/src/http_ipc/mod.rs | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/talpid_ipc/src/http_ipc/mod.rs b/talpid_ipc/src/http_ipc/mod.rs index 24e177a755..133ce5f1ef 100644 --- a/talpid_ipc/src/http_ipc/mod.rs +++ b/talpid_ipc/src/http_ipc/mod.rs @@ -3,6 +3,7 @@ extern crate jsonrpc_http_server; use self::jsonrpc_http_server::{ServerBuilder, Server}; use std::net::{SocketAddr, IpAddr, Ipv4Addr}; +use std::result::Result as StdResult; mod connection_info; @@ -18,47 +19,45 @@ impl ServerHandle { } pub fn start(build_router: fn() -> jsonrpc_core::IoHandler) -> Result<ServerHandle> { - let server = start_server(build_router)?; - - let write_res = connection_info::write(&server.address) + let server = start_server(build_router).chain_err(|| ErrorKind::UnableToStartServer)?; + let write_result = connection_info::write(&server.address) .chain_err(|| ErrorKind::FailedToWriteConnectionInfo); - if let Err(e) = write_res { - debug!("Could not write the connection info, killing the IPC server"); + if let Err(e) = write_result { + error!("Could not write the connection info, killing the IPC server"); server.stop(); - - return Err(e); + Err(e) + } else { + info!("Started Ipc server on: {:?}", server.address); + Ok(server) } - - info!("Started Ipc server on: {:?}", server.address); - Ok(server) } -fn start_server(build_router: fn() -> jsonrpc_core::IoHandler) -> Result<ServerHandle> { - - let ip = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)); +fn start_server(build_router: fn() -> jsonrpc_core::IoHandler) + -> StdResult<ServerHandle, jsonrpc_http_server::Error> { + let mut last_error = None; for port in 5000..5010 { - let server_config = ServerBuilder::new(build_router()).allow_only_bind_host(); - - let socket_addr = SocketAddr::new(ip, port); - let start_res = attempt_to_start(server_config, &socket_addr); - - match start_res { - Ok(server) => { - return Ok(ServerHandle { - address: format!("http://{}", socket_addr), - server: server, - }); - } - Err(Error(ErrorKind::UnableToStartServer, _)) => (), - Err(e) => return Err(e), + match start_server_on_port(port, build_router()) { + Ok(server) => return Ok(server), + Err(e) => last_error = Some(e), } } - bail!(ErrorKind::UnableToStartServer) + bail!(last_error.unwrap()); } -fn attempt_to_start(server_config: ServerBuilder, address: &SocketAddr) -> Result<Server> { - server_config.start_http(&address) - .chain_err(|| ErrorKind::UnableToStartServer) +fn start_server_on_port(port: u16, + router: jsonrpc_core::IoHandler) + -> StdResult<ServerHandle, jsonrpc_http_server::Error> { + let ip = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)); + let listen_addr = SocketAddr::new(ip, port); + ServerBuilder::new(router) + .allow_only_bind_host() + .start_http(&listen_addr) + .map(|server| { + ServerHandle { + address: format!("http://{}", listen_addr), + server: server, + } + }) } error_chain! { |
