Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e9c57ba

Browse files
committed
Merge pull request 0rpc#25 from lopter/master
Add an “inspect_error” middleware hook
2 parents 44b7543 + e196f9b commit e9c57ba

File tree

3 files changed

+56
-6
lines changed

3 files changed

+56
-6
lines changed

tests/test_middleware.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,3 +524,43 @@ def echo(self, msg):
524524
assert subscriber_tracer._log == [
525525
('load', publisher_tracer.trace_id),
526526
]
527+
528+
def test_inspect_error_middleware():
529+
530+
class InspectErrorMiddleware(Tracer):
531+
def __init__(self):
532+
self.called = False
533+
Tracer.__init__(self, identity='[server]')
534+
535+
def inspect_error(self, task_context, exc_info):
536+
assert 'trace_id' in task_context
537+
exc_type, exc_value, exc_traceback = exc_info
538+
self.called = True
539+
540+
class Srv(object):
541+
def echo(self, msg):
542+
raise RuntimeError(msg)
543+
544+
endpoint = random_ipc_endpoint()
545+
546+
middleware = InspectErrorMiddleware()
547+
ctx = zerorpc.Context()
548+
ctx.register_middleware(middleware)
549+
550+
module = Srv()
551+
server = zerorpc.Server(module, context=ctx)
552+
server.bind(endpoint)
553+
gevent.spawn(server.run)
554+
555+
client = zerorpc.Client()
556+
client.connect(endpoint)
557+
558+
try:
559+
client.echo('This is a test which should call the InspectErrorMiddleware')
560+
except zerorpc.exceptions.RemoteError as ex:
561+
assert ex.name == 'RuntimeError'
562+
563+
client.close()
564+
server.close()
565+
566+
assert middleware.called is True

zerorpc/context.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,13 @@ class Context(zmq.Context):
3535
def __init__(self):
3636
self._middlewares = []
3737
self._middlewares_hooks = {
38-
'resolve_endpoint': [],
39-
'raise_error': [],
40-
'call_procedure': [],
41-
'load_task_context': [],
42-
'get_task_context': [],
43-
}
38+
'resolve_endpoint': [],
39+
'raise_error': [],
40+
'call_procedure': [],
41+
'load_task_context': [],
42+
'get_task_context': [],
43+
'inspect_error': []
44+
}
4445

4546
@staticmethod
4647
def get_instance():
@@ -71,6 +72,12 @@ def middleware_resolve_endpoint(self, endpoint):
7172
endpoint = functor(endpoint)
7273
return endpoint
7374

75+
def middleware_inspect_error(self, exc_type, exc_value, exc_traceback):
76+
exc_info = exc_type, exc_value, exc_traceback
77+
task_context = self.middleware_get_task_context()
78+
for functor in self._middlewares_hooks['inspect_error']:
79+
functor(task_context, exc_info)
80+
7481
def middleware_raise_error(self, event):
7582
for functor in self._middlewares_hooks['raise_error']:
7683
functor(event)

zerorpc/core.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ def _print_traceback(self, protocol_v1):
113113
traceback.print_exception(exc_type, exc_value, exc_traceback,
114114
file=sys.stderr)
115115

116+
self._context.middleware_inspect_error(exc_type, exc_value,
117+
exc_traceback)
118+
116119
if protocol_v1:
117120
return (repr(exc_value),)
118121

0 commit comments

Comments
 (0)