From: Elena Balakhonova Date: Wed, 4 Dec 2019 10:58:00 +0000 (+0300) Subject: Add graceful shutdown X-Git-Tag: v2.0.0~15 X-Git-Url: http://www.git.cypherpunks.ru/?p=gocheese.git;a=commitdiff_plain;h=2334184c7877686dc4a636306f6cb24da59958e8 Add graceful shutdown --- diff --git a/gocheese.go b/gocheese.go index 835e8c5..7a6d9ff 100644 --- a/gocheese.go +++ b/gocheese.go @@ -20,6 +20,7 @@ package main import ( "bytes" + "context" "crypto/sha256" "encoding/hex" "flag" @@ -36,6 +37,7 @@ import ( "runtime" "strings" "syscall" + "time" ) const ( @@ -441,14 +443,34 @@ func main() { refreshPasswd() log.Println("root:", *root, "bind:", *bind) needsRefreshPasswd := make(chan os.Signal, 0) + needsShutdown := make(chan os.Signal, 0) + killed := make(chan error, 0) + http.HandleFunc(*norefreshURLPath, handler) + http.HandleFunc(*refreshURLPath, handler) + s := &http.Server{ + Addr: *bind, + ReadTimeout: time.Minute, + WriteTimeout: time.Minute, + } signal.Notify(needsRefreshPasswd, syscall.SIGHUP) + signal.Notify(needsShutdown, syscall.SIGTERM, syscall.SIGINT) go func() { for range needsRefreshPasswd { log.Println("Refreshing passwords") refreshPasswd() } }() - http.HandleFunc(*norefreshURLPath, handler) - http.HandleFunc(*refreshURLPath, handler) - log.Fatal(http.ListenAndServe(*bind, nil)) + go func(s *http.Server) { + <-needsShutdown + log.Println("Shutting down") + ctx, cancel := context.WithTimeout(context.TODO(), time.Minute) + killed <- s.Shutdown(ctx) + cancel() + }(s) + if err := s.ListenAndServe(); err != http.ErrServerClosed { + log.Fatal(err) + } + if err := <-killed; err != nil { + log.Fatal(err) + } }