@@ -2,6 +2,7 @@ package main
2
2
3
3
import (
4
4
"context"
5
+ "encoding/json"
5
6
"flag"
6
7
"fmt"
7
8
"net/http"
@@ -11,6 +12,8 @@ import (
11
12
"syscall"
12
13
"time"
13
14
15
+ "github.com/gorilla/mux"
16
+
14
17
cloudevents "github.com/cloudevents/sdk-go/v2"
15
18
16
19
function "function"
@@ -47,58 +50,69 @@ func run() error {
47
50
cancel ()
48
51
}()
49
52
50
- var handler interface {} = function .Handle
53
+ // Use a gorilla mux for handling all HTTP requests
54
+ router := mux .NewRouter ()
51
55
52
- httpHandler := toHttpHandler (handler , ctx )
56
+ // Add handlers for readiness and liveness endpoints
57
+ router .HandleFunc ("/health/{endpoint:readiness|liveness}" , func (w http.ResponseWriter , r * http.Request ) {
58
+ json .NewEncoder (w ).Encode (map [string ]bool {"ok" : true })
59
+ })
53
60
54
- if httpHandler != nil {
55
- httpServer := & http.Server {
56
- Addr : fmt .Sprintf (":%d" , * port ),
57
- Handler : httpHandler ,
58
- ReadTimeout : 1 * time .Minute ,
59
- WriteTimeout : 1 * time .Minute ,
60
- MaxHeaderBytes : 1 << 20 ,
61
- }
61
+ var handler interface {} = function .Handle
62
62
63
- listenAndServeErr := make (chan error , 1 )
64
- go func () {
65
- if * verbose {
66
- fmt .Printf ("listening on http port %v for HTTP requests\n " , * port )
67
- }
68
- err := httpServer .ListenAndServe ()
69
- cancel ()
70
- listenAndServeErr <- err
71
- }()
72
-
73
- <- ctx .Done ()
74
- shutdownCtx , shutdownCancelFn := context .WithTimeout (context .Background (), time .Second * 5 )
75
- defer shutdownCancelFn ()
76
- err := httpServer .Shutdown (shutdownCtx )
77
- if err != nil {
78
- fmt .Fprintf (os .Stderr , "error on server shutdown: %v\n " , err )
79
- }
63
+ httpHandler := toHttpHandler (handler , ctx )
80
64
81
- err = <- listenAndServeErr
82
- if http . ErrServerClosed == err {
83
- return nil
65
+ if httpHandler == nil {
66
+ if * verbose {
67
+ fmt . Printf ( "Initializing CloudEvent function \n " )
84
68
}
85
- return err
86
- } else {
87
- transport , err := cloudevents .NewHTTP (
69
+ protocol , err := cloudevents .NewHTTP (
88
70
cloudevents .WithPort (* port ),
89
- cloudevents .WithPath ("/" ))
71
+ cloudevents .WithPath ("/" ),
72
+ )
90
73
if err != nil {
91
74
return err
92
75
}
93
- client , err := cloudevents .NewClient (transport )
94
- if err != nil {
95
- return err
76
+ eventHandler , err := cloudevents .NewHTTPReceiveHandler (ctx , protocol , handler )
77
+ router .Handle ("/" , eventHandler )
78
+ } else {
79
+ if * verbose {
80
+ fmt .Printf ("Initializing HTTP function\n " )
96
81
}
82
+ router .Handle ("/" , httpHandler )
83
+ }
84
+
85
+ httpServer := & http.Server {
86
+ Addr : fmt .Sprintf (":%d" , * port ),
87
+ Handler : router ,
88
+ ReadTimeout : 1 * time .Minute ,
89
+ WriteTimeout : 1 * time .Minute ,
90
+ MaxHeaderBytes : 1 << 20 ,
91
+ }
92
+
93
+ listenAndServeErr := make (chan error , 1 )
94
+ go func () {
97
95
if * verbose {
98
- fmt .Printf ("listening on http port %v for JSON-encoded CloudEvents \n " , * port )
96
+ fmt .Printf ("listening on http port %v\n " , * port )
99
97
}
100
- return client .StartReceiver (ctx , handler )
98
+ err := httpServer .ListenAndServe ()
99
+ cancel ()
100
+ listenAndServeErr <- err
101
+ }()
102
+
103
+ <- ctx .Done ()
104
+ shutdownCtx , shutdownCancelFn := context .WithTimeout (context .Background (), time .Second * 5 )
105
+ defer shutdownCancelFn ()
106
+ err := httpServer .Shutdown (shutdownCtx )
107
+ if err != nil {
108
+ fmt .Fprintf (os .Stderr , "error on server shutdown: %v\n " , err )
109
+ }
110
+
111
+ err = <- listenAndServeErr
112
+ if http .ErrServerClosed == err {
113
+ return nil
101
114
}
115
+ return err
102
116
}
103
117
104
118
// if the handler signature is compatible with http handler the function returns an instance of `http.Handler`,
0 commit comments