@@ -3,30 +3,17 @@ package main
3
3
import (
4
4
"context"
5
5
"flag"
6
- "fmt"
7
- "log"
8
6
"net/http"
9
7
"os"
10
8
"os/signal"
11
- "sync/atomic"
12
9
"time"
13
10
14
11
"github.com/ncarlier/webhookd/pkg/api"
15
- "github.com/ncarlier/webhookd/pkg/auth "
12
+ "github.com/ncarlier/webhookd/pkg/config "
16
13
"github.com/ncarlier/webhookd/pkg/logger"
17
14
"github.com/ncarlier/webhookd/pkg/worker"
18
15
)
19
16
20
- type key int
21
-
22
- const (
23
- requestIDKey key = 0
24
- )
25
-
26
- var (
27
- healthy int32
28
- )
29
-
30
17
func main () {
31
18
flag .Parse ()
32
19
@@ -35,47 +22,25 @@ func main() {
35
22
return
36
23
}
37
24
38
- var authmethod auth.Method
39
- name := * config .Authentication
40
- if _ , ok := auth .AvailableMethods [name ]; ok {
41
- authmethod = auth .AvailableMethods [name ]
42
- if err := authmethod .ParseParam (* config .AuthenticationParam ); err != nil {
43
- fmt .Println ("Authentication parameter is not valid:" , err .Error ())
44
- fmt .Println (authmethod .Usage ())
45
- os .Exit (2 )
46
- }
47
- } else {
48
- fmt .Println ("Authentication name is not valid:" , name )
49
- os .Exit (2 )
50
- }
25
+ conf := config .Get ()
51
26
52
27
level := "info"
53
- if * config .Debug {
28
+ if * conf .Debug {
54
29
level = "debug"
55
30
}
56
31
logger .Init (level )
57
32
58
33
logger .Debug .Println ("Starting webhookd server..." )
59
- logger .Debug .Println ("Using Authentication:" , name )
60
- authmethod .Init (* config .Debug )
61
-
62
- router := http .NewServeMux ()
63
- router .Handle ("/" , api .Index (* config .Timeout , * config .ScriptDir ))
64
- router .Handle ("/healthz" , healthz ())
65
-
66
- nextRequestID := func () string {
67
- return fmt .Sprintf ("%d" , time .Now ().UnixNano ())
68
- }
69
34
70
35
server := & http.Server {
71
- Addr : * config .ListenAddr ,
72
- Handler : authmethod . Middleware ()( tracing ( nextRequestID )( logging ( logger . Debug )( router ) )),
36
+ Addr : * conf .ListenAddr ,
37
+ Handler : api . NewRouter ( config . Get ( )),
73
38
ErrorLog : logger .Error ,
74
39
}
75
40
76
41
// Start the dispatcher.
77
- logger .Debug .Printf ("Starting the dispatcher (%d workers)...\n " , * config .NbWorkers )
78
- worker .StartDispatcher (* config .NbWorkers )
42
+ logger .Debug .Printf ("Starting the dispatcher (%d workers)...\n " , * conf .NbWorkers )
43
+ worker .StartDispatcher (* conf .NbWorkers )
79
44
80
45
done := make (chan bool )
81
46
quit := make (chan os.Signal , 1 )
@@ -84,7 +49,7 @@ func main() {
84
49
go func () {
85
50
<- quit
86
51
logger .Debug .Println ("Server is shutting down..." )
87
- atomic . StoreInt32 ( & healthy , 0 )
52
+ api . Shutdown ( )
88
53
89
54
ctx , cancel := context .WithTimeout (context .Background (), 30 * time .Second )
90
55
defer cancel ()
@@ -96,51 +61,12 @@ func main() {
96
61
close (done )
97
62
}()
98
63
99
- logger .Info .Println ("Server is ready to handle requests at" , * config .ListenAddr )
100
- atomic . StoreInt32 ( & healthy , 1 )
64
+ logger .Info .Println ("Server is ready to handle requests at" , * conf .ListenAddr )
65
+ api . Start ( )
101
66
if err := server .ListenAndServe (); err != nil && err != http .ErrServerClosed {
102
- logger .Error .Fatalf ("Could not listen on %s: %v\n " , * config .ListenAddr , err )
67
+ logger .Error .Fatalf ("Could not listen on %s: %v\n " , * conf .ListenAddr , err )
103
68
}
104
69
105
70
<- done
106
71
logger .Debug .Println ("Server stopped" )
107
72
}
108
-
109
- func healthz () http.Handler {
110
- return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
111
- if atomic .LoadInt32 (& healthy ) == 1 {
112
- w .WriteHeader (http .StatusNoContent )
113
- return
114
- }
115
- w .WriteHeader (http .StatusServiceUnavailable )
116
- })
117
- }
118
-
119
- func logging (logger * log.Logger ) func (http.Handler ) http.Handler {
120
- return func (next http.Handler ) http.Handler {
121
- return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
122
- defer func () {
123
- requestID , ok := r .Context ().Value (requestIDKey ).(string )
124
- if ! ok {
125
- requestID = "unknown"
126
- }
127
- logger .Println (requestID , r .Method , r .URL .Path , r .RemoteAddr , r .UserAgent ())
128
- }()
129
- next .ServeHTTP (w , r )
130
- })
131
- }
132
- }
133
-
134
- func tracing (nextRequestID func () string ) func (http.Handler ) http.Handler {
135
- return func (next http.Handler ) http.Handler {
136
- return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
137
- requestID := r .Header .Get ("X-Request-Id" )
138
- if requestID == "" {
139
- requestID = nextRequestID ()
140
- }
141
- ctx := context .WithValue (r .Context (), requestIDKey , requestID )
142
- w .Header ().Set ("X-Request-Id" , requestID )
143
- next .ServeHTTP (w , r .WithContext (ctx ))
144
- })
145
- }
146
- }
0 commit comments