forked from mailgun/manners
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstatic.go
More file actions
89 lines (81 loc) · 2.11 KB
/
static.go
File metadata and controls
89 lines (81 loc) · 2.11 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package manners
import (
"log"
"net"
"net/http"
"os"
"os/signal"
"sync"
"syscall"
"time"
)
const (
DefaultGracePeriod = 15 * time.Second
)
var (
servers []*GracefulServer
m sync.Mutex
signals sync.Once
)
// ListenAndServe provides a graceful version of the function provided by the net/http package.
// Call Close() to stop all started servers.
func ListenAndServe(addr string, handler http.Handler) error {
registerShutdownSignals()
server := NewWithServer(&http.Server{Addr: addr, Handler: handler})
m.Lock()
servers = append(servers, server)
m.Unlock()
return server.ListenAndServe()
}
// ListenAndServeTLS provides a graceful version of the function provided by the net/http package.
// Call Close() to stop all started servers.
func ListenAndServeTLS(addr string, certFile string, keyFile string, handler http.Handler) error {
registerShutdownSignals()
server := NewWithServer(&http.Server{Addr: addr, Handler: handler})
m.Lock()
servers = append(servers, server)
m.Unlock()
return server.ListenAndServeTLS(certFile, keyFile)
}
// Serve provides a graceful version of the function provided by the net/http package.
// Call Close() to stop all started servers.
func Serve(l net.Listener, handler http.Handler) error {
registerShutdownSignals()
server := NewWithServer(&http.Server{Handler: handler})
m.Lock()
servers = append(servers, server)
m.Unlock()
return server.Serve(l)
}
// Close triggers a shutdown of all running Graceful servers.
// Call Close() to stop all started servers.
func Close() {
m.Lock()
for _, s := range servers {
s.Close()
}
servers = nil
m.Unlock()
}
func registerShutdownSignals() {
signals.Do(func() {
sigc := make(chan os.Signal, 1)
signal.Notify(sigc,
syscall.SIGHUP,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT)
go func() {
<-sigc
log.Printf("Beginning grace period (%s)\n", DefaultGracePeriod)
select {
// If a second signal is received, abandon ship and exit immediatly
case <-sigc:
log.Println("Canceled grace period")
case <-time.After(DefaultGracePeriod):
}
Close()
log.Println("Listeners closed")
}()
})
}