]> Sergey Matveev's repositories - godlighty.git/blobdiff - cmd/godlighty/main.go
chan os.Signal should be buffered
[godlighty.git] / cmd / godlighty / main.go
index 22f0c22131a4e235315d8998c9f1069df854379c..2373ed628a8f8b95322810dda56e6932107c11d8 100644 (file)
@@ -1,6 +1,6 @@
 /*
 godlighty -- highly-customizable HTTP, HTTP/2, HTTPS server
-Copyright (C) 2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2021-2023 Sergey Matveev <stargrave@stargrave.org>
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -31,6 +31,7 @@ import (
        "syscall"
        "time"
 
+       "github.com/davecgh/go-spew/spew"
        "golang.org/x/net/netutil"
 
        "go.stargrave.org/godlighty"
@@ -39,7 +40,10 @@ import (
 
 const MaxConns = 128
 
-var GracefulTime = 10 * time.Second
+var (
+       GracefulTime = 10 * time.Second
+       RWTimeout    = 30 * time.Second
+)
 
 func main() {
        bind := flag.String("bind", "[::]:80", "Address to bind and listen on")
@@ -53,10 +57,10 @@ func main() {
        if *doTLS {
                godlighty.LoadCertificates()
        }
-       shutdown := make(chan os.Signal)
+       shutdown := make(chan os.Signal, 1)
        signal.Notify(shutdown, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP)
        exitErr := make(chan error)
-       l, err := net.Listen("tcp", *bind)
+       l, err := godlighty.DeadlinedListen("tcp", *bind, RWTimeout, RWTimeout)
        if err != nil {
                log.Fatalln(err)
        }
@@ -91,7 +95,21 @@ func main() {
                }
        }
 
-       srv := http.Server{Handler: godlighty.MainHandler}
+       info := make(chan os.Signal, 1)
+       signal.Notify(info, InfoSignal)
+       go func() {
+               for {
+                       <-info
+                       spew.Fdump(os.Stdout, godlighty.Hosts)
+               }
+       }()
+
+       godlighty.BindAddr = *bind
+       srv := http.Server{
+               Handler:           godlighty.MainHandler,
+               ReadHeaderTimeout: RWTimeout,
+               IdleTimeout:       time.Minute,
+       }
        go func() {
                <-shutdown
                log.Println("shutting down")
@@ -101,11 +119,8 @@ func main() {
        }()
        var ll net.Listener
        if *doTLS {
-               tlsCfg := tls.Config{
-                       GetCertificate: godlighty.GetCertificate,
-                       NextProtos:     []string{"h2", "http/1.1"},
-               }
-               ll = tls.NewListener(netutil.LimitListener(l, MaxConns), &tlsCfg)
+               tlsCfg := godlighty.NewTLSConfig()
+               ll = tls.NewListener(netutil.LimitListener(l, MaxConns), tlsCfg)
        } else {
                ll = netutil.LimitListener(l, MaxConns)
        }