From a238c7e0889cbe7dfaa1a700dea30686a4e2139a Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Tue, 18 Jun 2024 15:58:53 +0200 Subject: extract socket passing protocol handler to package --- internal/listenfd/listenfd.go | 33 +++++++++++++++++++++++++++++++++ internal/server/server.go | 10 +++++++--- 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 internal/listenfd/listenfd.go (limited to 'internal') diff --git a/internal/listenfd/listenfd.go b/internal/listenfd/listenfd.go new file mode 100644 index 0000000..7d020b0 --- /dev/null +++ b/internal/listenfd/listenfd.go @@ -0,0 +1,33 @@ +package listenfd + +import ( + "net" + "os" + "strconv" + + "github.com/pkg/errors" +) + +const fdStart = 3 + +func GetListener(i uint64) (net.Listener, error) { + lfds, present := os.LookupEnv("LISTEN_FDS") + if !present { + return nil, nil + } + + fds, err := strconv.ParseUint(lfds, 10, 32) + if err != nil { + return nil, errors.Wrap(err, "could not parse LISTEN_FDS") + } + if i >= fds { + return nil, errors.Errorf("only %d fds available, requested index %d", fds, i) + } + + l, err := net.FileListener(os.NewFile(uintptr(i+fdStart), "")) + if err != nil { + return nil, errors.Wrap(err, "could not create listener") + } + + return l, nil +} diff --git a/internal/server/server.go b/internal/server/server.go index d2939ca..1b0407d 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -6,12 +6,12 @@ import ( "net" "net/http" "net/url" - "os" "slices" "time" "website/internal/builder" cfg "website/internal/config" + "website/internal/listenfd" "website/internal/log" "website/internal/website" @@ -161,14 +161,18 @@ func New(runtimeConfig *Config) (*Server, error) { } func (s *Server) Start() error { - f := os.NewFile(uintptr(3), "") - l, err := net.FileListener(f) + l, err := listenfd.GetListener(0) if err != nil { + log.Warn("could not create listener from listenfd", "error", err) + } + + if l == nil { l, err = net.Listen("tcp", s.Addr) if err != nil { return errors.Wrap(err, "could not create listener") } } + if err := http.Serve(l, s.Handler); err != http.ErrServerClosed { return errors.Wrap(err, "error creating/closing server") } -- cgit 1.4.1