-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathweb.go
More file actions
101 lines (88 loc) · 1.94 KB
/
web.go
File metadata and controls
101 lines (88 loc) · 1.94 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
90
91
92
93
94
95
96
97
98
99
100
101
package services
import (
"fmt"
"net"
"net/http"
"sync"
"time"
"github.com/bcashier/gracenet"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
"github.com/urfave/cli"
)
const (
WEB_HOST_FLAG = "host"
WEB_PORT_FLAG = "port"
WEB_GRACE_FLAG = "grace"
)
func RegisterWebFlags(c *cli.App) {
c.Flags = append(c.Flags, cli.StringFlag{
Name: WEB_HOST_FLAG,
Usage: "listening host",
Value: "",
})
c.Flags = append(c.Flags, cli.IntFlag{
Name: WEB_PORT_FLAG,
Usage: "http listening port",
Value: 8080,
})
c.Flags = append(c.Flags, cli.IntFlag{
Name: WEB_GRACE_FLAG,
Usage: "grace in seconds",
Value: 600,
EnvVar: "GRACE",
})
}
type Web struct {
ws *WebSeeder
host string
port int
grace int
gln *gracenet.GraceListener
mux sync.Mutex
err error
inited bool
}
func NewWeb(c *cli.Context, ws *WebSeeder) *Web {
return &Web{host: c.String(WEB_HOST_FLAG), port: c.Int(WEB_PORT_FLAG), ws: ws, grace: c.Int(WEB_GRACE_FLAG), inited: false}
}
func (s *Web) getListener() (*gracenet.GraceListener, error) {
s.mux.Lock()
defer s.mux.Unlock()
if s.inited {
return s.gln, s.err
}
s.inited = true
addr := fmt.Sprintf("%s:%d", s.host, s.port)
ln, err := net.Listen("tcp", addr)
if err != nil {
s.err = errors.Wrap(err, "Failed to listen to tcp connection")
s.gln = nil
return s.gln, s.err
}
s.gln = gracenet.NewGraceListener(NewBlockListener(ln, []net.IP{net.ParseIP("127.0.0.1")}), time.Duration(s.grace)*time.Second)
s.err = nil
return s.gln, s.err
}
func (s *Web) Serve() error {
ln, err := s.getListener()
if err != nil {
return err
}
mux := http.NewServeMux()
mux.Handle("/", s.ws)
log.Infof("Serving Web at %v", fmt.Sprintf("%s:%d", s.host, s.port))
return http.Serve(ln, mux)
}
func (s *Web) Close() {
if s.gln != nil {
s.gln.Close()
}
}
func (s *Web) Expire() (<-chan bool, error) {
ln, err := s.getListener()
if err != nil {
return nil, err
}
return ln.Expire(), nil
}