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

Skip to content

Commit 53e8e65

Browse files
aluzzardibombela
authored andcommitted
Added the call_procedure middleware
1 parent 6e7f415 commit 53e8e65

File tree

3 files changed

+126
-12
lines changed

3 files changed

+126
-12
lines changed

tests/test_middleware.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,100 @@ def raise_error(self, event):
152152

153153
client.close()
154154
srv.close()
155+
156+
157+
def test_call_procedure():
158+
c = zerorpc.Context()
159+
160+
def test(argument):
161+
return 'ret_real:' + argument
162+
assert c.middleware_call_procedure(test, 'dummy') == 'ret_real:dummy'
163+
164+
def middleware_1(procedure, *args, **kwargs):
165+
return 'ret_middleware_1:' + procedure(*args, **kwargs)
166+
cnt = c.register_middleware({
167+
'call_procedure': middleware_1
168+
})
169+
assert cnt == 1
170+
assert c.middleware_call_procedure(test, 'dummy') == \
171+
'ret_middleware_1:ret_real:dummy'
172+
173+
def middleware_2(procedure, *args, **kwargs):
174+
return 'ret_middleware_2:' + procedure(*args, **kwargs)
175+
cnt = c.register_middleware({
176+
'call_procedure': middleware_2
177+
})
178+
assert cnt == 1
179+
assert c.middleware_call_procedure(test, 'dummy') == \
180+
'ret_middleware_2:ret_middleware_1:ret_real:dummy'
181+
182+
def mangle_arguments(procedure, *args, **kwargs):
183+
return procedure(args[0].upper())
184+
cnt = c.register_middleware({
185+
'call_procedure': mangle_arguments
186+
})
187+
assert cnt == 1
188+
assert c.middleware_call_procedure(test, 'dummy') == \
189+
'ret_middleware_2:ret_middleware_1:ret_real:DUMMY'
190+
191+
endpoint = 'ipc://test_call_procedure'
192+
193+
# client/server
194+
class Server(zerorpc.Server):
195+
def test(self, argument):
196+
return 'ret_real:' + argument
197+
server = Server(heartbeat=1, context=c)
198+
server.bind(endpoint)
199+
gevent.spawn(server.run)
200+
client = zerorpc.Client(heartbeat=1, context=c)
201+
client.connect(endpoint)
202+
assert client.test('dummy') == \
203+
'ret_middleware_2:ret_middleware_1:ret_real:DUMMY'
204+
client.close()
205+
server.close()
206+
207+
# push/pull
208+
trigger = gevent.event.Event()
209+
class Puller(zerorpc.Puller):
210+
argument = None
211+
212+
def test(self, argument):
213+
self.argument = argument
214+
trigger.set()
215+
return self.argument
216+
217+
puller = Puller(context=c)
218+
puller.bind(endpoint)
219+
gevent.spawn(puller.run)
220+
pusher = zerorpc.Pusher(context=c)
221+
pusher.connect(endpoint)
222+
trigger.clear()
223+
pusher.test('dummy')
224+
trigger.wait()
225+
assert puller.argument == 'DUMMY'
226+
#FIXME: These seems to be broken
227+
# pusher.close()
228+
# puller.close()
229+
230+
# pub/sub
231+
trigger = gevent.event.Event()
232+
class Subscriber(zerorpc.Subscriber):
233+
argument = None
234+
235+
def test(self, argument):
236+
self.argument = argument
237+
trigger.set()
238+
return self.argument
239+
240+
subscriber = Subscriber(context=c)
241+
subscriber.bind(endpoint)
242+
gevent.spawn(subscriber.run)
243+
publisher = zerorpc.Publisher(context=c)
244+
publisher.connect(endpoint)
245+
trigger.clear()
246+
publisher.test('dummy')
247+
trigger.wait()
248+
assert subscriber.argument == 'DUMMY'
249+
#FIXME: These seems to be broken
250+
# publisher.close()
251+
# subscriber.close()

zerorpc/context.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ def __init__(self):
3535
self._middlewares = []
3636
self._middlewares_hooks = {
3737
'resolve_endpoint': [],
38-
'raise_error': []
38+
'raise_error': [],
39+
'call_procedure': []
3940
}
4041

4142
@staticmethod
@@ -70,3 +71,16 @@ def middleware_resolve_endpoint(self, endpoint):
7071
def middleware_raise_error(self, event):
7172
for functor in self._middlewares_hooks['raise_error']:
7273
functor(event)
74+
75+
def middleware_call_procedure(self, procedure, *args, **kwargs):
76+
class chain(object):
77+
def __init__(self, fct, next):
78+
self.fct = fct
79+
self.next = next
80+
81+
def __call__(self, *args, **kwargs):
82+
return self.fct(self.next, *args, **kwargs)
83+
84+
for functor in self._middlewares_hooks['call_procedure']:
85+
procedure = chain(functor, procedure)
86+
return procedure(*args, **kwargs)

zerorpc/core.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,15 @@ def _zerorpc_args(self):
7070

7171
class PatternReqRep():
7272

73-
def process_call(self, socket, event, functor):
74-
result = functor(*event.args)
73+
def process_call(self, context, socket, event, functor):
74+
result = context.middleware_call_procedure(functor, *event.args)
7575
socket.emit('OK', (result,))
7676

7777
def accept_answer(self, event):
7878
return True
7979

80-
def process_answer(self, socket, event, method, timeout,
81-
raise_remote_error):
80+
def process_answer(self, context, socket, event, method, timeout,
81+
raise_remote_error):
8282
result = event.args[0]
8383
if event.name == 'ERR':
8484
raise_remote_error(event)
@@ -93,15 +93,16 @@ class rep(DecoratorBase):
9393

9494
class PatternReqStream():
9595

96-
def process_call(self, socket, event, functor):
97-
for result in iter(functor(*event.args)):
96+
def process_call(self, context, socket, event, functor):
97+
for result in iter(context.middleware_call_procedure(functor,
98+
*event.args)):
9899
socket.emit('STREAM', result)
99100
socket.emit('STREAM_DONE', None)
100101

101102
def accept_answer(self, event):
102103
return event.name in ('STREAM', 'STREAM_DONE')
103104

104-
def process_answer(self, socket, event, method, timeout,
105+
def process_answer(self, context, socket, event, method, timeout,
105106
raise_remote_error):
106107
def iterator(event):
107108
while event.name == 'STREAM':
@@ -197,7 +198,7 @@ def _async_task(self, initial_event):
197198
functor = self._methods.get(event.name, None)
198199
if functor is None:
199200
raise NameError(event.name)
200-
functor.pattern.process_call(socket, event, functor)
201+
functor.pattern.process_call(self._context, socket, event, functor)
201202
except Exception:
202203
try:
203204
exc_type, exc_value, exc_traceback = sys.exc_info()
@@ -282,8 +283,8 @@ def _process_response(self, method, socket, timeout):
282283
'calling remote method {0}'.format(method))
283284

284285
pattern = self._select_pattern(event)
285-
return pattern.process_answer(socket, event, method, timeout,
286-
self._raise_remote_error)
286+
return pattern.process_answer(self._context, socket, event, method,
287+
timeout, self._raise_remote_error)
287288
except:
288289
socket.close()
289290
socket.channel.close()
@@ -365,7 +366,9 @@ def _receiver(self):
365366
try:
366367
if event.name not in self._methods:
367368
raise NameError(event.name)
368-
self._methods[event.name](*event.args)
369+
self._context.middleware_call_procedure(
370+
self._methods[event.name],
371+
*event.args)
369372
except Exception:
370373
traceback.print_exc(file=sys.stderr)
371374

0 commit comments

Comments
 (0)