예제 #1
0
파일: service.py 프로젝트: wezm/mitogen
    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
예제 #3
0
 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)
예제 #5
0
파일: service.py 프로젝트: wezm/mitogen
    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)
예제 #6
0
    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)
예제 #7
0
파일: service.py 프로젝트: ph448/mitogen
 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
예제 #11
0
    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))
예제 #12
0
    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
예제 #13
0
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))