Commit 4d71620c authored by Matthew Holt's avatar Matthew Holt

core (Windows): Retry every 100ms for 2s if listener fails to bind

In testing, I've found that Windows doesn't release the socket right away even though the listener is closed, so calling caddy.Start() right after caddy.Stop() can fail. This change has server.ListenAndServe() try up to 20 times every 100ms to bind the listener, and only return an error if it doesn't succeed after 2 seconds. This might be kind of nifty for Unix, too, but there hasn't been a need for it yet.
parent e4028b23
...@@ -117,8 +117,21 @@ func (s *Server) ListenAndServe() error { ...@@ -117,8 +117,21 @@ func (s *Server) ListenAndServe() error {
ln, err := net.Listen("tcp", s.Addr) ln, err := net.Listen("tcp", s.Addr)
if err != nil { if err != nil {
close(s.startChan) var succeeded bool
return err if runtime.GOOS == "windows" { // TODO: Limit this to Windows only? (it keeps sockets open after closing listeners)
for i := 0; i < 20; i++ {
time.Sleep(100 * time.Millisecond)
ln, err = net.Listen("tcp", s.Addr)
if err == nil {
succeeded = true
break
}
}
}
if !succeeded {
close(s.startChan)
return err
}
} }
return s.serve(ln.(*net.TCPListener)) return s.serve(ln.(*net.TCPListener))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment