未验证 提交 a99f1471 编写于 作者: B Ben Darnell 提交者: GitHub

Merge pull request #2589 from ploxiln/ws_open_exc_backport

websocket: Catch errors in async open() correctly (5.1 backport)
......@@ -181,6 +181,18 @@ class OpenCoroutineHandler(TestWebSocketHandler):
self.write_message('ok')
class ErrorInOpenHandler(TestWebSocketHandler):
def open(self):
raise Exception("boom")
class ErrorInAsyncOpenHandler(TestWebSocketHandler):
@gen.coroutine
def open(self):
yield gen.sleep(0.01)
raise Exception("boom")
class WebSocketBaseTestCase(AsyncHTTPTestCase):
@gen.coroutine
def ws_connect(self, path, **kwargs):
......@@ -225,6 +237,10 @@ class WebSocketTest(WebSocketBaseTestCase):
dict(close_future=self.close_future)),
('/open_coroutine', OpenCoroutineHandler,
dict(close_future=self.close_future, test=self)),
("/error_in_open", ErrorInOpenHandler,
dict(close_future=self.close_future)),
("/error_in_async_open", ErrorInAsyncOpenHandler,
dict(close_future=self.close_future)),
], template_loader=DictLoader({
'message.html': '<b>{{ message }}</b>',
}))
......@@ -511,6 +527,20 @@ class WebSocketTest(WebSocketBaseTestCase):
self.assertEqual(res, 'ok')
yield self.close(ws)
@gen_test
def test_error_in_open(self):
with ExpectLog(app_log, "Uncaught exception"):
ws = yield self.ws_connect("/error_in_open")
res = yield ws.read_message()
self.assertIsNone(res)
@gen_test
def test_error_in_async_open(self):
with ExpectLog(app_log, "Uncaught exception"):
ws = yield self.ws_connect("/error_in_async_open")
res = yield ws.read_message()
self.assertIsNone(res)
if sys.version_info >= (3, 5):
NativeCoroutineOnMessageHandler = exec_test(globals(), locals(), """
......
......@@ -751,10 +751,14 @@ class WebSocketProtocol13(WebSocketProtocol):
self.stream = self.handler.stream
self.start_pinging()
open_result = self._run_callback(self.handler.open, *self.handler.open_args,
**self.handler.open_kwargs)
if open_result is not None:
yield open_result
try:
open_result = self.handler.open(*self.handler.open_args, **self.handler.open_kwargs)
if open_result is not None:
yield open_result
except Exception:
self.handler.log_exception(*sys.exc_info())
self._abort()
yield self._receive_frame_loop()
def _parse_extensions_header(self, headers):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册