def dispatch_one(self, msg): if not all(p.is_authorized(self, msg) for p in self.policies): LOG.error('%r: unauthorized message %r', self, msg) msg.reply(mitogen.core.CallError('Unauthorized')) return if len(msg.data) > self.max_message_size: LOG.error('%r: larger than permitted size: %r', self, msg) msg.reply(mitogen.core.CallError('Message size exceeded')) return args = msg.unpickle(throw=False) if (args == mitogen.core._DEAD or isinstance(args, mitogen.core.CallError) or not self.validate_args(args)): LOG.warning('Received junk message: %r', args) return try: response = self.dispatch(args, msg) if response is not self.NO_REPLY: msg.reply(response) except Exception, e: LOG.exception('While invoking %r.dispatch()', self) msg.reply(mitogen.core.CallError(e))
def _worker_main(self): try: self._worker_run() except Exception: th = threading.currentThread() LOG.exception('%r: worker %r crashed', self, th.getName()) raise
def on_receive_message(self, msg): try: response = self._on_receive_message(msg) if response is not self.NO_REPLY: msg.reply(response) except mitogen.core.CallError: e = sys.exc_info()[1] LOG.warning('%r: call error: %s: %s', self, msg, e) msg.reply(e) except Exception: LOG.exception('While invoking %r.dispatch()', self) e = sys.exc_info()[1] msg.reply(mitogen.core.CallError(e))
def _worker_run(self): while not self.closed: try: event = self._select.get_event() except (mitogen.core.ChannelError, mitogen.core.LatchError): e = sys.exc_info()[1] LOG.debug('%r: channel or latch closed, exitting: %s', self, e) return func = self._func_by_source[event.source] try: func(event) except Exception: LOG.exception('While handling %r using %r', event.data, func)
def _worker_run(self): while True: try: msg = self._select.get() except (mitogen.core.ChannelError, mitogen.core.LatchError): e = sys.exc_info()[1] LOG.error('%r: channel or latch closed, exitting: %s', self, e) return service = msg.receiver.service try: service.dispatch_one(msg) except Exception: LOG.exception('While handling %r using %r', msg, service)
def _worker_run(self): while not self.closed: try: msg = self._select.get() except (mitogen.core.ChannelError, mitogen.core.LatchError): e = sys.exc_info()[1] LOG.info('%r: channel or latch closed, exitting: %s', self, e) return func = self._func_by_recv[msg.receiver] try: func(msg.receiver, msg) except Exception: LOG.exception('While handling %r using %r', msg, func)
def _on_service_call(self, recv, msg): self._validate(msg) service_name, method_name, kwargs = msg.unpickle() try: invoker = self.get_invoker(service_name, msg) return invoker.invoke(method_name, kwargs, msg) except mitogen.core.CallError: e = sys.exc_info()[1] LOG.warning('%r: call error: %s: %s', self, msg, e) msg.reply(e) except Exception: LOG.exception('While invoking %r._invoke()', self) e = sys.exc_info()[1] msg.reply(mitogen.core.CallError(e))
def _run(self): while True: tup = self._pop() if tup is None: return method_name, kwargs, msg = tup try: super(SerializedInvoker, self).invoke(method_name, kwargs, msg) except mitogen.core.CallError: e = sys.exc_info()[1] LOG.warning('%r: call error: %s: %s', self, msg, e) msg.reply(e) except Exception: LOG.exception('%r: while invoking %s()', self, method_name) msg.reply(mitogen.core.Message.dead())
def _on_service_call(self, event): msg = event.data service_name = None method_name = None try: self._validate(msg) service_name, method_name, kwargs = msg.unpickle() invoker = self.get_invoker(service_name, msg) return invoker.invoke(method_name, kwargs, msg) except mitogen.core.CallError: e = sys.exc_info()[1] LOG.warning('%r: call error: %s: %s', self, msg, e) msg.reply(e) except Exception: LOG.exception('%r: while invoking %r of %r', self, method_name, service_name) e = sys.exc_info()[1] msg.reply(mitogen.core.CallError(e))
def _invoke(self, method_name, kwargs, msg): method = getattr(self.service, method_name) if 'msg' in func_code(method).co_varnames: kwargs['msg'] = msg # TODO: hack no_reply = getattr(method, 'mitogen_service__no_reply', False) ret = None try: ret = method(**kwargs) if no_reply: return Service.NO_REPLY return ret except Exception: if no_reply: LOG.exception('While calling no-reply method %s.%s', type(self.service).__name__, func_name(method)) else: raise
def dispatch_one(self, msg): if len(msg.data) > self.max_message_size: LOG.error('%r: larger than permitted size: %r', self, msg) msg.reply(mitogen.core.CallError('Message size exceeded')) return args = msg.unpickle(throw=False) if (args == mitogen.core._DEAD or isinstance(args, mitogen.core.CallError) or not self.validate_args(args)): LOG.warning('Received junk message: %r', args) return try: msg.reply(self.dispatch(args, msg)) except Exception, e: LOG.exception('While invoking %r.dispatch()', self) msg.reply(mitogen.core.CallError(e))
def _on_receive_message(self, msg): method_name, kwargs = self._validate_message(msg) method = getattr(self, method_name) if 'msg' in method.func_code.co_varnames: kwargs['msg'] = msg # TODO: hack no_reply = getattr(method, 'mitogen_service__no_reply', False) ret = None try: ret = method(**kwargs) if no_reply: return self.NO_REPLY return ret except Exception: if no_reply: LOG.exception('While calling no-reply method %s.%s', type(self).__name__, method.func_name) else: raise
class Service(object): #: If ``None``, a handle is dynamically allocated, otherwise the fixed #: integer handle to use. handle = None max_message_size = 0 def __init__(self, router): self.router = router self.recv = mitogen.core.Receiver(router, self.handle) self.handle = self.recv.handle self.running = True def validate_args(self, args): return True def run_once(self): try: msg = self.recv.get() except mitogen.core.ChannelError, e: # Channel closed due to broker shutdown, exit gracefully. LOG.debug('%r: channel closed: %s', self, e) self.running = False return if len(msg.data) > self.max_message_size: LOG.error('%r: larger than permitted size: %r', self, msg) msg.reply(mitogen.core.CallError('Message size exceeded')) return args = msg.unpickle(throw=False) if (args == mitogen.core._DEAD or isinstance(args, mitogen.core.CallError) or not self.validate_args(args)): LOG.warning('Received junk message: %r', args) return try: msg.reply(self.dispatch(args, msg)) except Exception, e: LOG.exception('While invoking %r.dispatch()', self) msg.reply(mitogen.core.CallError(e))