Merge pull request #7768 from minrk/handle-close

handle zmq messages that may be processed after websocket is closed
This commit is contained in:
Min RK 2015-02-13 10:25:36 -08:00
commit 69fe3a6d64

View File

@ -94,11 +94,23 @@ if os.environ.get('IPYTHON_ALLOW_DRAFT_WEBSOCKETS_FOR_PHANTOMJS', False):
class ZMQStreamHandler(WebSocketHandler): class ZMQStreamHandler(WebSocketHandler):
if tornado.version_info < (4,1):
"""Backport send_error from tornado 4.1 to 4.0"""
def send_error(self, *args, **kwargs):
if self.stream is None:
super(WebSocketHandler, self).send_error(*args, **kwargs)
else:
# If we get an uncaught exception during the handshake,
# we have no choice but to abruptly close the connection.
# TODO: for uncaught exceptions after the handshake,
# we can close the connection more gracefully.
self.stream.close()
def check_origin(self, origin): def check_origin(self, origin):
"""Check Origin == Host or Access-Control-Allow-Origin. """Check Origin == Host or Access-Control-Allow-Origin.
Tornado >= 4 calls this method automatically, raising 403 if it returns False. Tornado >= 4 calls this method automatically, raising 403 if it returns False.
We call it explicitly in `open` on Tornado < 4.
""" """
if self.allow_origin == '*': if self.allow_origin == '*':
return True return True
@ -160,7 +172,10 @@ class ZMQStreamHandler(WebSocketHandler):
def _on_zmq_reply(self, stream, msg_list): def _on_zmq_reply(self, stream, msg_list):
# Sometimes this gets triggered when the on_close method is scheduled in the # Sometimes this gets triggered when the on_close method is scheduled in the
# eventloop but hasn't been called. # eventloop but hasn't been called.
if stream.closed(): return if self.stream.closed() or stream.closed():
self.log.warn("zmq message arrived on closed channel")
self.close()
return
channel = getattr(stream, 'channel', None) channel = getattr(stream, 'channel', None)
try: try:
msg = self._reserialize_reply(msg_list, channel=channel) msg = self._reserialize_reply(msg_list, channel=channel)