aboutsummaryrefslogtreecommitdiff
path: root/cmd/pkgsite/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/pkgsite/main.go')
-rw-r--r--cmd/pkgsite/main.go33
1 files changed, 32 insertions, 1 deletions
diff --git a/cmd/pkgsite/main.go b/cmd/pkgsite/main.go
index eae690e0..06968618 100644
--- a/cmd/pkgsite/main.go
+++ b/cmd/pkgsite/main.go
@@ -89,6 +89,10 @@ func main() {
flag.BoolVar(&serverCfg.DevMode, "dev", false, "enable developer mode (reload templates on each page load, serve non-minified JS/CSS, etc.)")
flag.StringVar(&serverCfg.DevModeStaticDir, "static", "static", "path to folder containing static files served")
+ var shutdownIdleDuration string
+ flag.StringVar(&shutdownIdleDuration, `shutdown-idle`, ``,
+ `Shutdown the server after idle on specific duration.`)
+
flag.Usage = func() {
out := flag.CommandLine.Output()
fmt.Fprintf(out, "usage: %s [flags] [PATHS ...]\n", os.Args[0])
@@ -98,6 +102,15 @@ func main() {
}
flag.Parse()
+ if shutdownIdleDuration != `` {
+ var err error
+ timeout.ShutdownIdleDuration, err = time.ParseDuration(shutdownIdleDuration)
+ if err != nil {
+ dief(`invalid shutdown-idle duration %s`, shutdownIdleDuration)
+ }
+ timeout.ShutdownIdleTimer = time.NewTimer(timeout.ShutdownIdleDuration)
+ }
+
serverCfg.UseLocalStdlib = true
serverCfg.GoRepoPath = *goRepoPath
serverCfg.Paths = collectPaths(flag.Args())
@@ -171,7 +184,25 @@ func main() {
server.Install(router.Handle, nil, nil)
mw := timeout.Timeout(54 * time.Second)
srv := &http.Server{Addr: addr, Handler: mw(router)}
- dief("%v", srv.Serve(ln))
+
+ if timeout.ShutdownIdleTimer == nil {
+ dief("%v", srv.Serve(ln))
+ } else {
+ waitq := make(chan struct{}, 1)
+ go func() {
+ err = srv.Serve(ln)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "%s\n", err.Error())
+ }
+ waitq <- struct{}{}
+ }()
+ select {
+ case <-waitq:
+ // Server stopped.
+ case <-timeout.ShutdownIdleTimer.C:
+ _ = srv.Shutdown(context.Background())
+ }
+ }
}
func dief(format string, args ...any) {