From 88697cf2aefe974cad209f7a63a4cd4753efa888 Mon Sep 17 00:00:00 2001 From: dre Date: Thu, 8 Jul 2021 19:31:05 +0800 Subject: [PATCH] add reload of main listener on SIGHUP --- gemini/gemini.go | 59 ++++++++++++++++++++++++++++++------------------ main.go | 9 -------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/gemini/gemini.go b/gemini/gemini.go index d44b176..b1b2f10 100644 --- a/gemini/gemini.go +++ b/gemini/gemini.go @@ -11,8 +11,11 @@ import ( "log" "net" "net/url" + "os" + "os/signal" "path" "strings" + "syscall" "time" "unicode/utf8" ) @@ -113,39 +116,51 @@ func (s *Server) logf(format string, v ...interface{}) { } func (s *Server) ListenAndServe() error { - s.closed = make(chan struct{}) + hup := make(chan os.Signal, 1) + signal.Notify(hup, syscall.SIGHUP) + go func() { + for { + <-hup + if s.listener != nil { + // TODO: reload TLSConfig + s.listener.Close() + } + } + }() // outer for loop, if listener closes we will restart it. This may be useful if we switch out // TLSConfig. - //for { - var err error - s.listener, err = tls.Listen("tcp", s.Addr, s.TLSConfig) - if err != nil { - return fmt.Errorf("gemini server listen: %w", err) - } - - queue := make(chan net.Conn, s.MaxOpenConns) - go s.handleConnectionQueue(queue) - for { - conn, err := s.listener.Accept() + s.closed = make(chan struct{}) + var err error + s.listener, err = tls.Listen("tcp", s.Addr, s.TLSConfig) if err != nil { - s.logf("server accept error: %v", err) - break + return fmt.Errorf("gemini server listen: %w", err) } - queue <- conn - // un-stuck call after shutdown will trigger a drop here + queue := make(chan net.Conn, s.MaxOpenConns) + go s.handleConnectionQueue(queue) + + s.logf("Accepting new connections on %v", s.listener.Addr()) + for { + conn, err := s.listener.Accept() + if err != nil { + s.logf("server accept error: %v", err) + break + } + queue <- conn + + // un-stuck call after shutdown will trigger a drop here + if s.shutdown { + break + } + } + // closed confirms the accept call stopped + close(s.closed) if s.shutdown { break } } - // closed confirms the accept call stopped - close(s.closed) - //if s.shutdown { - // return nil - //} - //} s.log("closing listener gracefully") return s.listener.Close() } diff --git a/main.go b/main.go index 96a9650..d0c6846 100644 --- a/main.go +++ b/main.go @@ -134,15 +134,6 @@ func main() { <-confirm cancel() - /* - hup := make(chan os.Signal, 1) - signal.Notify(hup, syscall.SIGHUP) - go func() { - for { - <-hup - } - }() - */ } func logger(log *log.Logger) func(next gemini.Handler) gemini.Handler {