def _on_accept(self, conn, addr): """Serve acceptted connection. Should be used in the context of a threaded server, see threaded_connection(), or fork server (not implemented here). """ logging.info('Enter, addr=%s.', addr) c = Connection(conn) try: # # Instantiate handler for the lifetime of the connection, # making it possible to manage a state between calls. # handler = self._handler_type(addr, self._handler_context) try: while True: data = c.read() type, name, args, kwargs = loads(data) # Buffer the call for later processing with self.process self.inBuf.append((handler, c, type, name, args, kwargs)) except: logging.debug('Caught end of file, error=%r.', sys.exc_info()[1]) finally: c.close() if 'handler' in locals(): handler._close()
def _dispatch(self, handler, conn, n=1000): """Serve single call.""" for i in range(n): data = conn.read() type, name, args, kwargs = loads(data) try: foo = handler._methods.get(name, None) or handler._get_method(name) result = foo(*args, **kwargs) error = None except Exception: logging.debug('Caught exception raised by callable.', exc_info=True) # Use exc_info for py2.x py3.x compatibility. t, v, tb = sys.exc_info() if t in BUILTIN_EXCEPTIONS: error = (t.__name__, v.args) else: error = (repr(t), v.args) result = None if type == CALL: response = dumps((result, error)) conn.write(response)
def __call__(self, *args, **kwargs): """Call method on server.""" data = dumps((CALL, self._name, args, kwargs)) self._conn.write(data) response = self._conn.read() value, error = loads(response) if error is None: return value try: name, args = error except TypeError: # Handle old way of returning error as repr. logging.warning('Unknown error returned by proxy, error=%s.', error) raise ServerError(error) logging.warning('Error returned by proxy, name=%s, args=%s.', name, args) # Raise built-in exceptions sent by server. if name in BUILTIN_EXCEPTIONS_NAMES: e = getattr(builtins, name)() e.args = args raise e # Exception sent from server. Original traceback unavailable. self._on_exception(name, args)