def __iter__(self): request = self.request rpc = request['rpc'] status_code = 200 try: result = rpc.process(request) except Exception as e: result = as_failure(e) handler = rpc.handler result = maybe_async(result) while is_async(result): yield b'' result = maybe_async(result) try: if is_failure(result): e = result.trace[1] status_code = getattr(e, 'status', 400) log_failure(result) result = handler.dumps(rpc.id, rpc.version, error=e) else: result = handler.dumps(rpc.id, rpc.version, result=result) except Exception as e: LOGGER.error('Could not serialize', exc_info=True) status_code = 500 result = handler.dumps(rpc.id, rpc.version, error=e) content = to_bytes(result) response = WsgiResponse(status_code, content, content_type=handler.content_type) for c in self.start(response): yield c
def wsgi_iterator(gen, encoding=None): encoding = encoding or "utf-8" for data in gen: data = maybe_async(data) while is_async(data): yield b"" data = maybe_async(data) if data is NOT_DONE: yield b"" elif data is None: continue elif is_failure(data): log_failure(data) else: if isinstance(data, bytes): yield data elif isinstance(data, string_type): yield data.encode(encoding) else: for b in wsgi_iterator(data, encoding): yield b