1
+ use std:: net:: { IpAddr , Ipv4Addr } ;
1
2
use std:: path:: PathBuf ;
2
3
use std:: sync:: Arc ;
3
4
@@ -13,7 +14,7 @@ use tokio::task::JoinHandle;
13
14
use tower_http:: services:: { ServeDir , ServeFile } ;
14
15
use tower_http:: trace:: TraceLayer ;
15
16
16
- use crate :: common:: SERVER ;
17
+ use crate :: common:: { LOCAL , NETWORK , SERVER } ;
17
18
use crate :: config:: RtcServe ;
18
19
use crate :: proxy:: { ProxyHandlerHttp , ProxyHandlerWebSocket } ;
19
20
use crate :: watch:: WatchSystem ;
@@ -122,8 +123,40 @@ impl ServeSystem {
122
123
. serve ( router. into_make_service ( ) )
123
124
. with_graceful_shutdown ( shutdown_fut) ;
124
125
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
+ }
125
159
// Block this routine on the server's completion.
126
- tracing:: info!( "{} server listening at http://{}" , SERVER , addr) ;
127
160
Ok ( tokio:: spawn ( async move {
128
161
if let Err ( err) = server. await {
129
162
tracing:: error!( error = ?err, "error from server task" ) ;
0 commit comments