From bd5a88e954db1c9da2b64912bc16aa68205d45d6 Mon Sep 17 00:00:00 2001 From: MinRK Date: Wed, 13 Aug 2014 21:51:52 -0700 Subject: [PATCH] handle undefined or closed zmq_stream in on_message can happen if a message is waiting in a pipe and the web socket is closed before the message is handled. And give ZMQChannels a nice repr with their kernel ID --- IPython/html/services/kernels/handlers.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/IPython/html/services/kernels/handlers.py b/IPython/html/services/kernels/handlers.py index 3d4337fd6..b51861e95 100644 --- a/IPython/html/services/kernels/handlers.py +++ b/IPython/html/services/kernels/handlers.py @@ -84,6 +84,9 @@ class KernelActionHandler(IPythonHandler): class ZMQChannelHandler(AuthenticatedZMQStreamHandler): + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, getattr(self, 'kernel_id', 'uninitialized')) + def create_stream(self): km = self.kernel_manager meth = getattr(km, 'connect_%s' % self.channel) @@ -145,6 +148,12 @@ class ZMQChannelHandler(AuthenticatedZMQStreamHandler): self.zmq_stream.on_recv(self._on_zmq_reply) def on_message(self, msg): + if self.zmq_stream is None: + return + elif self.zmq_stream.closed(): + self.log.info("%s closed, closing websocket.", self) + self.close() + return msg = json.loads(msg) self.session.send(self.zmq_stream, msg)