summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2017-04-05 14:10:02 +0200
committerErik Larkö <erik@mullvad.net>2017-04-07 13:08:25 +0800
commitcec08d90d944ed819f97db65533ea370e47bbf6f (patch)
tree2f60d5701acbe88903ca2dd8a6c8226146f86b83
parentb527821174cde1de5123ae3d0e6827639522a44c (diff)
downloadmullvadvpn-cec08d90d944ed819f97db65533ea370e47bbf6f.tar.xz
mullvadvpn-cec08d90d944ed819f97db65533ea370e47bbf6f.zip
Put all chain_err on level. Return last error
-rw-r--r--talpid_ipc/src/http_ipc/mod.rs61
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! {