From 3f7adb3bd627e88f49eeffeecd28edc2c8979aee Mon Sep 17 00:00:00 2001 From: Tangent Wantwight Date: Sun, 17 Nov 2019 23:55:55 -0500 Subject: [PATCH] Bind to multiple addresses if given a DNS name --- src/commands/relay.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/commands/relay.rs b/src/commands/relay.rs index 96f6514..2d48766 100644 --- a/src/commands/relay.rs +++ b/src/commands/relay.rs @@ -101,9 +101,13 @@ pub fn options() -> App<'static, 'static> { pub fn run(args: &ArgMatches) -> Result<(), WebmetroError> { let channel_map = Arc::new(Mutex::new(WeakValueHashMap::>>::new())); - let addr_str = args.value_of("listen").ok_or("Listen address wasn't provided")?; - let addr = addr_str.to_socket_addrs()?.next().ok_or("Listen address didn't resolve")?; + + let addrs = addr_str.to_socket_addrs()?; + info!("Binding to {:?}", addrs); + if addrs.len() == 0 { + return Err("Listen address didn't resolve".into()); + } let channel = path!("live" / String).map(move |name: String| { let channel = channel_map.lock().unwrap() @@ -134,5 +138,11 @@ pub fn run(args: &ArgMatches) -> Result<(), WebmetroError> { .or(get) .or(post_put); - Ok(warp::serve(routes).run(addr)) + let mut rt = tokio::runtime::Runtime::new()?; + + for do_serve in addrs.map(|addr| warp::serve(routes.clone()).try_bind(addr)) { + rt.spawn(do_serve); + } + + rt.shutdown_on_idle().wait().map_err(|_| "Shutdown error.".into()) }