@@ -153,10 +153,16 @@ impl<F: RuntimeFactors> HttpServer<F> {
153153 Err ( err) => {
154154 if self . find_free_port && err. kind ( ) == ErrorKind :: AddrInUse {
155155 let mut found_listener = None ;
156+ let mut addr = self . listen_addr ;
156157 for _ in 1 ..=9 {
157- let mut addr = self . listen_addr ;
158158 addr. set_port ( addr. port ( ) + 1 ) ;
159159
160+ if !addr. port ( ) == u16:: MAX {
161+ return Err ( anyhow:: anyhow!(
162+ "Couldn't find a free port as we've reached the maximum port number. Consider retrying with a lower base port."
163+ ) ) ;
164+ }
165+
160166 match TcpListener :: bind ( addr) . await {
161167 Ok ( listener) => {
162168 found_listener = Some ( listener) ;
@@ -166,21 +172,21 @@ impl<F: RuntimeFactors> HttpServer<F> {
166172 if err. kind ( ) == ErrorKind :: AddrInUse {
167173 continue ;
168174 }
169- return Err ( anyhow:: anyhow!( "Unable to listen on {}" , addr) ) ;
175+ return Err ( anyhow:: anyhow!(
176+ "Unable to listen on {}" ,
177+ self . listen_addr
178+ ) ) ;
170179 }
171180 }
172181 }
173182
174- match found_listener {
175- Some ( listener) => listener,
176- None => {
177- return Err ( anyhow:: anyhow!(
178- "All retries failed. Unable to bind to a free port"
179- ) ) ;
180- }
181- }
183+ found_listener. ok_or_else ( || anyhow:: anyhow!(
184+ "Couldn't find a free port in the range {}-{}. Consider retrying with a different base port." ,
185+ self . listen_addr. port( ) ,
186+ self . listen_addr. port( ) + 9
187+ ) ) ?
182188 } else {
183- return Err ( anyhow:: anyhow!( "Unable to listen on {}" , self . listen_addr) ) ;
189+ return Err ( anyhow:: anyhow!( "Unable to listen on {}. To have Spin search for a free port, use the --find-free-port option. " , self . listen_addr) ) ;
184190 }
185191 }
186192 } ;
0 commit comments