diff options
author | feistel <6742251-feistel@users.noreply.gitlab.com> | 2022-01-15 20:51:44 +0300 |
---|---|---|
committer | feistel <6742251-feistel@users.noreply.gitlab.com> | 2022-01-20 01:49:29 +0300 |
commit | b2b9c8d346f96257cd0fbc9577df1b9e81c28d21 (patch) | |
tree | 8f84102d4f965e3db4d3c79322f44d0443103757 /server.go | |
parent | a7e130776d934a12ab000bee930c5c353b772635 (diff) |
feat: implement graceful shutdown
Changelog: added
Diffstat (limited to 'server.go')
-rw-r--r-- | server.go | 37 |
1 files changed, 31 insertions, 6 deletions
@@ -23,11 +23,9 @@ type keepAliveSetter interface { } type listenerConfig struct { - fd uintptr isProxyV2 bool tlsConfig *tls.Config limiter *netutil.Limiter - handler http.Handler } func (ln *keepAliveListener) Accept() (net.Conn, error) { @@ -43,9 +41,16 @@ func (ln *keepAliveListener) Accept() (net.Conn, error) { return conn, nil } -func (a *theApp) listenAndServe(config listenerConfig) error { +func (a *theApp) listenAndServe(server *http.Server, fd uintptr, h http.Handler, opts ...option) error { + config := &listenerConfig{} + + for _, opt := range opts { + opt(config) + } + // create server - server := &http.Server{Handler: config.handler, TLSConfig: config.tlsConfig} + server.Handler = h + server.TLSConfig = config.tlsConfig // ensure http2 is enabled even if TLSConfig is not null // See https://github.com/golang/go/blob/97cee43c93cfccded197cd281f0a5885cdb605b4/src/net/http/server.go#L2947-L2954 @@ -53,9 +58,9 @@ func (a *theApp) listenAndServe(config listenerConfig) error { server.TLSConfig.NextProtos = append(server.TLSConfig.NextProtos, "h2") } - l, err := net.FileListener(os.NewFile(config.fd, "[socket]")) + l, err := net.FileListener(os.NewFile(fd, "[socket]")) if err != nil { - return fmt.Errorf("failed to listen on FD %d: %v", config.fd, err) + return fmt.Errorf("failed to listen on FD %d: %v", fd, err) } if config.limiter != nil { @@ -79,3 +84,23 @@ func (a *theApp) listenAndServe(config listenerConfig) error { return server.Serve(l) } + +type option func(*listenerConfig) + +func withProxyV2() option { + return func(conf *listenerConfig) { + conf.isProxyV2 = true + } +} + +func withTLSConfig(c *tls.Config) option { + return func(conf *listenerConfig) { + conf.tlsConfig = c + } +} + +func withLimiter(l *netutil.Limiter) option { + return func(conf *listenerConfig) { + conf.limiter = l + } +} |