@@ -40,16 +40,22 @@ func (h HandlerFunc) ServeKite(r *Request) (interface{}, error) {
40
40
return h (r )
41
41
}
42
42
43
+ // FinalFunc represents a proxy function that is called last
44
+ // in the method call chain, regardless whether whole call
45
+ // chained succeeded with non-nil error or not.
46
+ type FinalFunc func (r * Request , resp interface {}, err error ) (interface {}, error )
47
+
43
48
// Method defines a method and the Handler it is bind to. By default
44
49
// "ReturnMethod" handling is used.
45
50
type Method struct {
46
51
// name is the method name. Unnamed methods can exist
47
52
name string
48
53
49
54
// handler contains the related Handler for the given method
50
- handler Handler // handler is the base handler, the response of it is returned as the final
51
- preHandlers []Handler // a list of handlers that are executed before the main handler
52
- postHandlers []Handler // a list of handlers that are executed after the main handler
55
+ handler Handler // handler is the base handler, the response of it is returned as the final
56
+ preHandlers []Handler // a list of handlers that are executed before the main handler
57
+ postHandlers []Handler // a list of handlers that are executed after the main handler
58
+ finalFuncs []FinalFunc // a list of final funcs executed upon returning from ServeKite
53
59
54
60
// authenticate defines if a given authenticator function is enabled for
55
61
// the given auth type in the request.
@@ -78,8 +84,6 @@ func (k *Kite) addHandle(method string, handler Handler) *Method {
78
84
m := & Method {
79
85
name : method ,
80
86
handler : handler ,
81
- preHandlers : make ([]Handler , 0 ),
82
- postHandlers : make ([]Handler , 0 ),
83
87
authenticate : authenticate ,
84
88
handling : k .MethodHandling ,
85
89
}
@@ -142,6 +146,16 @@ func (m *Method) PostHandleFunc(handler HandlerFunc) *Method {
142
146
return m .PostHandle (handler )
143
147
}
144
148
149
+ // FinalFunc registers a funtion that is always called as a last one
150
+ // after pre-, handler and post- functions for the given method.
151
+ //
152
+ // It receives a result and an error from last handler that
153
+ // got executed prior to calling final func.
154
+ func (m * Method ) FinalFunc (f FinalFunc ) * Method {
155
+ m .finalFuncs = append (m .finalFuncs , f )
156
+ return m
157
+ }
158
+
145
159
// Handle registers the handler for the given method. The handler is called
146
160
// when a method call is received from a Kite.
147
161
func (k * Kite ) Handle (method string , handler Handler ) * Method {
@@ -181,6 +195,15 @@ func (k *Kite) PostHandleFunc(handler HandlerFunc) {
181
195
k .PostHandle (handler )
182
196
}
183
197
198
+ // FinalFunc registers a funtion that is always called as a last one
199
+ // after pre-, handler and post- functions.
200
+ //
201
+ // It receives a result and an error from last handler that
202
+ // got executed prior to calling final func.
203
+ func (k * Kite ) FinalFunc (f FinalFunc ) {
204
+ k .finalFuncs = append (k .finalFuncs , f )
205
+ }
206
+
184
207
func (m * Method ) ServeKite (r * Request ) (interface {}, error ) {
185
208
var firstResp interface {}
186
209
var resp interface {}
@@ -199,7 +222,7 @@ func (m *Method) ServeKite(r *Request) (interface{}, error) {
199
222
for _ , handler := range preHandlers {
200
223
resp , err = handler .ServeKite (r )
201
224
if err != nil {
202
- return nil , err
225
+ return m . final ( r , nil , err )
203
226
}
204
227
205
228
if m .handling == ReturnFirst && resp != nil && firstResp == nil {
@@ -212,7 +235,7 @@ func (m *Method) ServeKite(r *Request) (interface{}, error) {
212
235
// now call our base handler
213
236
resp , err = m .handler .ServeKite (r )
214
237
if err != nil {
215
- return nil , err
238
+ return m . final ( r , nil , err )
216
239
}
217
240
218
241
// also save it dependent on the handling mechanism
@@ -233,7 +256,7 @@ func (m *Method) ServeKite(r *Request) (interface{}, error) {
233
256
for _ , handler := range postHandlers {
234
257
resp , err = handler .ServeKite (r )
235
258
if err != nil {
236
- return nil , err
259
+ return m . final ( r , nil , err )
237
260
}
238
261
239
262
if m .handling == ReturnFirst && resp != nil && firstResp == nil {
@@ -245,12 +268,17 @@ func (m *Method) ServeKite(r *Request) (interface{}, error) {
245
268
246
269
switch m .handling {
247
270
case ReturnMethod :
248
- return methodResp , nil
271
+ resp = methodResp
249
272
case ReturnFirst :
250
- return firstResp , nil
251
- case ReturnLatest :
252
- return resp , nil
273
+ resp = firstResp
253
274
}
254
275
255
- return resp , nil
276
+ return m .final (r , resp , nil )
277
+ }
278
+
279
+ func (m * Method ) final (r * Request , resp interface {}, err error ) (interface {}, error ) {
280
+ for _ , f := range m .finalFuncs {
281
+ resp , err = f (r , resp , err )
282
+ }
283
+ return resp , err
256
284
}
0 commit comments