// ServeWith accepts connections on ln and serves them using serveConn. func (s *Server) ServeWith(stopper *stop.Stopper, l net.Listener, serveConn func(net.Conn)) error { // Inspired by net/http.(*Server).Serve var tempDelay time.Duration // how long to sleep on accept failure for { rw, e := l.Accept() if e != nil { if ne, ok := e.(net.Error); ok && ne.Temporary() { if tempDelay == 0 { tempDelay = 5 * time.Millisecond } else { tempDelay *= 2 } if max := 1 * time.Second; tempDelay > max { tempDelay = max } httpLogger.Printf("http: Accept error: %v; retrying in %v", e, tempDelay) time.Sleep(tempDelay) continue } return e } tempDelay = 0 go func() { defer stopper.Recover() s.Server.ConnState(rw, http.StateNew) // before Serve can return serveConn(rw) s.Server.ConnState(rw, http.StateClosed) }() } }