@@ -2,7 +2,6 @@ package server
2
2
3
3
import (
4
4
"context"
5
- "fmt"
6
5
"net/http"
7
6
"net/http/httptest"
8
7
"os"
@@ -16,6 +15,11 @@ import (
16
15
"github.com/sirupsen/logrus"
17
16
)
18
17
18
+ const (
19
+ defaultPort = 9090
20
+ defaultHealthPath = "/health"
21
+ )
22
+
19
23
// Server handles the setup and shutdown of the http server
20
24
// for an API
21
25
type Server struct {
@@ -52,44 +56,33 @@ type HealthChecker interface {
52
56
Healthy (w http.ResponseWriter , r * http.Request ) error
53
57
}
54
58
55
- func New (log logrus.FieldLogger , config Config , api APIDefinition ) (* Server , error ) {
56
- var healthHandler router.APIHandler
57
- if checker , ok := api .(HealthChecker ); ok {
58
- healthHandler = checker .Healthy
59
+ // NewOpts will create the server with many defaults. You can use the opts to override them.
60
+ // the one major default you can't change by this is the health path. This is set to /health
61
+ // and be enabled.
62
+ func NewOpts (log logrus.FieldLogger , api APIDefinition , opts ... Opt ) (* Server , error ) {
63
+ defaultOpts := []Opt {
64
+ WithHostAndPort ("" , defaultPort ),
59
65
}
60
66
61
- r := router .New (
62
- log ,
63
- router .OptHealthCheck (config .HealthPath , healthHandler ),
64
- router .OptEnableTracing (api .Info ().Name ),
65
- router .OptVersionHeader (api .Info ().Name , api .Info ().Version ),
66
- router .OptRecoverer (),
67
- )
68
-
69
- if err := api .Start (r ); err != nil {
70
- return nil , errors .Wrap (err , "Failed to start API" )
71
- }
67
+ return buildServer (log , api , append (defaultOpts , opts ... ), defaultHealthPath )
68
+ }
72
69
73
- s := Server {
74
- log : log .WithField ("component" , "server" ),
75
- svr : & http.Server {
76
- Addr : fmt .Sprintf ("%s:%d" , config .Host , config .Port ),
77
- Handler : r ,
78
- },
79
- api : api ,
80
- done : make (chan bool ),
70
+ // New will build a server with the defaults in place
71
+ func New (log logrus.FieldLogger , config Config , api APIDefinition ) (* Server , error ) {
72
+ opts := []Opt {
73
+ WithHostAndPort (config .Host , config .Port ),
81
74
}
82
75
83
76
if config .TLS .Enabled {
84
77
tcfg , err := config .TLS .TLSConfig ()
85
78
if err != nil {
86
79
return nil , errors .Wrap (err , "Failed to build TLS config" )
87
80
}
88
- s .svr .TLSConfig = tcfg
89
81
log .Info ("TLS enabled" )
82
+ opts = append (opts , WithTLS (tcfg ))
90
83
}
91
84
92
- return & s , nil
85
+ return buildServer ( log , api , opts , config . HealthPath )
93
86
}
94
87
95
88
func (s * Server ) Shutdown (to time.Duration ) error {
@@ -172,3 +165,41 @@ func APIFunc(start func(router.Router) error, stop func(), info APIInfo) APIDefi
172
165
info : info ,
173
166
}
174
167
}
168
+
169
+ func buildRouter (log logrus.FieldLogger , api APIDefinition , healthPath string ) router.Router {
170
+ var healthHandler router.APIHandler
171
+ if checker , ok := api .(HealthChecker ); ok {
172
+ healthHandler = checker .Healthy
173
+ }
174
+
175
+ r := router .New (
176
+ log ,
177
+ router .OptHealthCheck (healthPath , healthHandler ),
178
+ router .OptEnableTracing (api .Info ().Name ),
179
+ router .OptVersionHeader (api .Info ().Name , api .Info ().Version ),
180
+ router .OptRecoverer (),
181
+ )
182
+
183
+ return r
184
+ }
185
+
186
+ func buildServer (log logrus.FieldLogger , api APIDefinition , opts []Opt , healthPath string ) (* Server , error ) {
187
+ r := buildRouter (log , api , healthPath )
188
+
189
+ if err := api .Start (r ); err != nil {
190
+ return nil , errors .Wrap (err , "Failed to start API" )
191
+ }
192
+
193
+ svr := new (http.Server )
194
+ for _ , o := range opts {
195
+ o (svr )
196
+ }
197
+ svr .Handler = r
198
+ s := Server {
199
+ log : log .WithField ("component" , "server" ),
200
+ svr : svr ,
201
+ api : api ,
202
+ done : make (chan bool ),
203
+ }
204
+ return & s , nil
205
+ }
0 commit comments