-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconf.go
More file actions
75 lines (60 loc) · 1.82 KB
/
conf.go
File metadata and controls
75 lines (60 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package httpsrv
import (
"context"
"errors"
"fmt"
"net"
"net/http"
"time"
)
type serverConf struct {
srv *http.Server
l net.Listener
shutdownTO time.Duration // timeout for graceful shutdown
dieOnPanic bool
certFile, keyFile string // serve TLS if assigned
}
var (
errUnassignedAddr = errors.New("address to listen to is not assigned - to fix use either Listener parameter or set the Addr field of the http.Server parameter of Run")
errUnassignedHandler = errors.New("misconfigured http server, no handlers attached - to fix use either Endpoints parameter or set the Handler field of the http.Server parameter of Run")
)
func (cfg *serverConf) validate() error {
if cfg.srv.Handler == nil {
return errUnassignedHandler
}
if cfg.srv.Addr == "" && cfg.l == nil {
return errUnassignedAddr
}
return nil
}
func (cfg *serverConf) listener() (net.Listener, error) {
if cfg.l != nil {
return cfg.l, nil
}
var err error
if cfg.l, err = net.Listen("tcp", cfg.srv.Addr); err != nil {
return nil, fmt.Errorf("failed to create listener on %q: %w", cfg.srv.Addr, err)
}
return cfg.l, nil
}
func (cfg *serverConf) startFunc() func() error {
l, err := cfg.listener()
if err != nil {
return func() error { return err }
}
hasTLSConfig := cfg.srv.TLSConfig != nil && (len(cfg.srv.TLSConfig.Certificates) > 0 || cfg.srv.TLSConfig.GetCertificate != nil)
if cfg.keyFile != "" || cfg.certFile != "" || hasTLSConfig {
return func() error { return cfg.srv.ServeTLS(l, cfg.certFile, cfg.keyFile) }
}
return func() error { return cfg.srv.Serve(l) }
}
func (cfg *serverConf) stopFunc() func() error {
if cfg.shutdownTO <= 0 {
return func() error { return cfg.srv.Close() }
}
return func() error {
ctx, cancel := context.WithTimeout(context.Background(), cfg.shutdownTO)
defer cancel()
return cfg.srv.Shutdown(ctx)
}
}