diff --git a/mitogen/core.py b/mitogen/core.py index d8ffbb13..836c451a 100644 --- a/mitogen/core.py +++ b/mitogen/core.py @@ -1330,24 +1330,27 @@ class ExternalContext(object): finally: fp.close() + def _dispatch_one(self, msg): + data = msg.unpickle(throw=False) + _v and LOG.debug('_dispatch_calls(%r)', data) + if msg.auth_id not in mitogen.parent_ids: + LOG.warning('CALL_FUNCTION from non-parent %r', msg.auth_id) + + modname, klass, func, args, kwargs = data + obj = __import__(modname, {}, {}, ['']) + if klass: + obj = getattr(obj, klass) + fn = getattr(obj, func) + if getattr(fn, 'mitogen_takes_econtext', None): + kwargs.setdefault('econtext', self) + if getattr(fn, 'mitogen_takes_router', None): + kwargs.setdefault('router', self.router) + return fn(*args, **kwargs) + def _dispatch_calls(self): for msg in self.channel: - data = msg.unpickle(throw=False) - _v and LOG.debug('_dispatch_calls(%r)', data) - if msg.auth_id not in mitogen.parent_ids: - LOG.warning('CALL_FUNCTION from non-parent %r', msg.auth_id) - - modname, klass, func, args, kwargs = data try: - obj = __import__(modname, {}, {}, ['']) - if klass: - obj = getattr(obj, klass) - fn = getattr(obj, func) - if getattr(fn, 'mitogen_takes_econtext', None): - kwargs.setdefault('econtext', self) - if getattr(fn, 'mitogen_takes_router', None): - kwargs.setdefault('router', self.router) - msg.reply(fn(*args, **kwargs)) + msg.reply(self._dispatch_one(msg)) except Exception, e: _v and LOG.debug('_dispatch_calls: %s', e) msg.reply(CallError(e))