@@ -347,11 +347,19 @@ class BaseRequestHandler(object):
347347 DEFAULT_ERROR_CODE = 50000
348348
349349 def __init__ (self , api ,
350- default_version = None , default_protocol = DEFAULT_PROTOCOL ,
350+ default_version = None ,
351+ default_protocol = DEFAULT_PROTOCOL ,
352+ pre_call_hook = None ,
353+ post_call_hook = None ,
351354 log = DUMMY_LOG ):
352355 self .api = api
356+
353357 self .default_version = default_version
354358 self .default_protocol = default_protocol
359+
360+ self .pre_call_hook = pre_call_hook
361+ self .post_call_hook = post_call_hook
362+
355363 self .log = log
356364
357365 self ._protocols = self .PROTOCOLS
@@ -476,6 +484,24 @@ def _wrap_stream(self, req, res):
476484 except Exception as e :
477485 yield self ._handle_exception (req , e )
478486
487+ def _invoke_pre_call_hook (self , request ):
488+ if not self .pre_call_hook :
489+ return
490+
491+ try :
492+ self .pre_call_hook (request )
493+ except Exception :
494+ request .log .exception ('_invoke_pre_call_hook' )
495+
496+ def _invoke_post_call_hook (self , request , result = None , exception = None ):
497+ if not self .post_call_hook :
498+ return
499+
500+ try :
501+ self .post_call_hook (request , result = result , exception = exception )
502+ except Exception :
503+ request .log .exception ('_invoke_post_call_hook' )
504+
479505 def handle_request (self , request ):
480506 if self .api ._auth :
481507 request .auth = self .api ._auth .authenticate (request )
@@ -491,7 +517,11 @@ def handle_request(self, request):
491517 # invoke the API function
492518 tcompute = time .time ()
493519 try :
520+ self ._invoke_pre_call_hook (request )
494521 result = request .fn (** request .fn_params )
522+
523+ self ._invoke_post_call_hook (request , result = result )
524+
495525 except TypeError as e :
496526 if 'got an unexpected keyword argument' in str (e ): # FIXME: handle in better way
497527 raise KeywordArgumentError (e .args [0 ])
@@ -519,6 +549,8 @@ def handle_request(self, request):
519549 ** request .metrics )
520550
521551 except Exception as e :
552+ self ._invoke_post_call_hook (request , exception = e )
553+
522554 m = self ._handle_exception (request , e )
523555 response .write (m , protocol )
524556
0 commit comments