1+ use std:: net:: { IpAddr , Ipv4Addr } ;
12use std:: path:: PathBuf ;
23use std:: sync:: Arc ;
34
@@ -13,7 +14,7 @@ use tokio::task::JoinHandle;
1314use tower_http:: services:: { ServeDir , ServeFile } ;
1415use tower_http:: trace:: TraceLayer ;
1516
16- use crate :: common:: SERVER ;
17+ use crate :: common:: { LOCAL , NETWORK , SERVER } ;
1718use crate :: config:: RtcServe ;
1819use crate :: proxy:: { ProxyHandlerHttp , ProxyHandlerWebSocket } ;
1920use crate :: watch:: WatchSystem ;
@@ -122,8 +123,40 @@ impl ServeSystem {
122123 . serve ( router. into_make_service ( ) )
123124 . with_graceful_shutdown ( shutdown_fut) ;
124125
126+ if addr. ip ( ) . is_unspecified ( ) {
127+ let addresses = local_ip_address:: list_afinet_netifas ( )
128+ . map ( |addrs| {
129+ addrs
130+ . into_iter ( )
131+ . filter_map ( |( _, ipaddr) | match ipaddr {
132+ IpAddr :: V4 ( ip) if ip. is_private ( ) || ip. is_loopback ( ) => Some ( ip) ,
133+ _ => None ,
134+ } )
135+ . collect :: < Vec < _ > > ( )
136+ } )
137+ . unwrap_or_else ( |_| vec ! [ Ipv4Addr :: LOCALHOST ] ) ;
138+ tracing:: info!(
139+ "{} server listening at:\n {}" ,
140+ SERVER ,
141+ addresses
142+ . iter( )
143+ . map( |address| format!(
144+ " {} http://{}:{}" ,
145+ if address. is_loopback( ) {
146+ LOCAL
147+ } else {
148+ NETWORK
149+ } ,
150+ address,
151+ cfg. port
152+ ) )
153+ . collect:: <Vec <_>>( )
154+ . join( "\n " )
155+ ) ;
156+ } else {
157+ tracing:: info!( "{} server listening at http://{}" , SERVER , addr) ;
158+ }
125159 // Block this routine on the server's completion.
126- tracing:: info!( "{} server listening at http://{}" , SERVER , addr) ;
127160 Ok ( tokio:: spawn ( async move {
128161 if let Err ( err) = server. await {
129162 tracing:: error!( error = ?err, "error from server task" ) ;
0 commit comments