func main() { originalListener, err := net.Listen("tcp", ":8080") if err != nil { panic(err) } sl, err := stoppableListener.New(originalListener) if err != nil { panic(err) } http.HandleFunc("/", helloHttp) server := http.Server{} stop := make(chan os.Signal) signal.Notify(stop, syscall.SIGINT) var wg sync.WaitGroup go func() { wg.Add(1) defer wg.Done() server.Serve(sl) }() fmt.Printf("Serving HTTP\n") select { case signal := <-stop: fmt.Printf("Got signal:%v\n", signal) } fmt.Printf("Stopping listener\n") sl.Stop() fmt.Printf("Waiting on server\n") wg.Wait() }
func HTTPServe(addr string, timeout int) error { hostname, err := os.Hostname() if err != nil { panic(err) } originalListener, err := net.Listen("tcp4", addr) if err != nil { panic(err) } sl, err := stoppableListener.New(originalListener) if err != nil { panic(err) } c := make(chan string) go func() { logger.Logf("%v: serving on %v\n", hostname, addr) // Wait for either timeout or connect from client select { case <-time.After(time.Duration(timeout) * time.Second): { logger.Logf("%v: Serve timed out after %v seconds\n", hostname, timeout) } case client := (<-c): { logger.Logf("%v: Serve got a connection from %v\n", hostname, client) } } sl.Stop() }() serveMux := http.NewServeMux() serveMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { logger.Logf("%v: Serve got a connection from %v\n", hostname, r.RemoteAddr) fmt.Fprintf(w, "%v", hostname) c <- r.RemoteAddr }) err = http.Serve(sl, serveMux) if err != nil && err.Error() == "Listener stopped" { err = nil } return err }