forked from chr4/go-stellar-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
chi-router.go
88 lines (69 loc) · 1.86 KB
/
chi-router.go
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
package server
import (
"fmt"
"net/http"
"time"
"github.com/go-chi/chi"
"github.com/stellar/go/support/log"
"github.com/tylerb/graceful"
"golang.org/x/net/http2"
)
// TLSConfig specifies the TLS portion of a config
type TLSConfig struct {
CertificateFile string `toml:"certificate-file" valid:"required"`
PrivateKeyFile string `toml:"private-key-file" valid:"required"`
}
// routeMaker translates the HTTP string method to the chi-equivalent route operation
var routeMaker = map[string]func(*chi.Mux, string, http.HandlerFunc){
http.MethodGet: func(mux *chi.Mux, route string, fn http.HandlerFunc) {
mux.Get(route, fn)
},
http.MethodPost: func(mux *chi.Mux, route string, fn http.HandlerFunc) {
mux.Post(route, fn)
},
}
// NewRouter creates a new router with the provided config
func NewRouter(c *Config) *chi.Mux {
mux := chi.NewRouter()
// add middleware
mux.Use(c.middlewares...)
// add routes
for method, routes := range c.router {
bindFn := routeMaker[method]
for _, route := range routes {
bindFn(mux, route.path, route.handler)
}
}
// not found handler
if c.notFound != nil {
mux.NotFound(c.notFound)
}
return mux
}
// Serve starts a web server by binding it to a socket and setting up the shutdown signals
func Serve(router *chi.Mux, port int, tls *TLSConfig) {
http.Handle("/", router)
addr := fmt.Sprintf(":%d", port)
srv := &graceful.Server{
Timeout: 10 * time.Second,
Server: &http.Server{
Addr: addr,
Handler: http.DefaultServeMux,
},
ShutdownInitiated: func() {
log.Info("received signal, gracefully stopping")
},
}
http2.ConfigureServer(srv.Server, nil)
log.Info("Starting web service on " + addr)
var err error
if tls != nil {
err = srv.ListenAndServeTLS(tls.CertificateFile, tls.PrivateKeyFile)
} else {
err = srv.ListenAndServe()
}
if err != nil {
log.Panic(err)
}
log.Info("stopped")
}