from tornado.concurrent import Future
from tornado import gen
from tornado.httpclient import HTTPError, HTTPRequest
+from tornado.iostream import StreamClosedError
from tornado.log import gen_log, app_log
from tornado.template import DictLoader
from tornado.testing import AsyncHTTPTestCase, gen_test, bind_unused_port, ExpectLog
class EchoHandler(TestWebSocketHandler):
def on_message(self, message):
- self.write_message(message, isinstance(message, bytes))
+ try:
+ self.write_message(message, isinstance(message, bytes))
+ except StreamClosedError:
+ pass
class ErrorInOnMessageHandler(TestWebSocketHandler):
self.assertEqual(code, 1001)
self.assertEqual(reason, 'goodbye')
+ @gen_test
+ def test_write_after_close(self):
+ ws = yield self.ws_connect('/close_reason')
+ msg = yield ws.read_message()
+ self.assertIs(msg, None)
+ with self.assertRaises(StreamClosedError):
+ ws.write_message('hello')
+
@gen_test
def test_async_prepare(self):
# Previously, an async prepare method triggered a bug that would
data = mask + _websocket_mask(mask, data)
frame += data
self._wire_bytes_out += len(frame)
- try:
- return self.stream.write(frame)
- except StreamClosedError:
- self._abort()
+ return self.stream.write(frame)
def write_message(self, message, binary=False):
"""Sends the given message to the client of this Web Socket."""
self.close(self.handler.close_code)
elif opcode == 0x9:
# Ping
- self._write_frame(True, 0xA, data)
+ try:
+ self._write_frame(True, 0xA, data)
+ except StreamClosedError:
+ self._abort()
self._run_callback(self.handler.on_ping, data)
elif opcode == 0xA:
# Pong
close_data = struct.pack('>H', code)
if reason is not None:
close_data += utf8(reason)
- self._write_frame(True, 0x8, close_data)
+ try:
+ self._write_frame(True, 0x8, close_data)
+ except StreamClosedError:
+ self._abort()
self.server_terminated = True
if self.client_terminated:
if self._waiting is not None: