From 2334184c7877686dc4a636306f6cb24da59958e8 Mon Sep 17 00:00:00 2001 From: Elena Balakhonova Date: Wed, 4 Dec 2019 13:58:00 +0300 Subject: [PATCH] Add graceful shutdown --- gocheese.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) 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) + } } -- 2.44.0