Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
镜像
tornadoweb
Tornado
提交
a99f1471
Tornado
项目概览
镜像
/
tornadoweb
/
Tornado
大约 1 年 前同步成功
通知
26
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Tornado
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
a99f1471
编写于
3月 01, 2019
作者:
B
Ben Darnell
提交者:
GitHub
3月 01, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2589 from ploxiln/ws_open_exc_backport
websocket: Catch errors in async open() correctly (5.1 backport)
上级
97d65996
e38f2ae5
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
38 addition
and
4 deletion
+38
-4
tornado/test/websocket_test.py
tornado/test/websocket_test.py
+30
-0
tornado/websocket.py
tornado/websocket.py
+8
-4
未找到文件。
tornado/test/websocket_test.py
浏览文件 @
a99f1471
...
@@ -181,6 +181,18 @@ class OpenCoroutineHandler(TestWebSocketHandler):
...
@@ -181,6 +181,18 @@ class OpenCoroutineHandler(TestWebSocketHandler):
self
.
write_message
(
'ok'
)
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
):
class
WebSocketBaseTestCase
(
AsyncHTTPTestCase
):
@
gen
.
coroutine
@
gen
.
coroutine
def
ws_connect
(
self
,
path
,
**
kwargs
):
def
ws_connect
(
self
,
path
,
**
kwargs
):
...
@@ -225,6 +237,10 @@ class WebSocketTest(WebSocketBaseTestCase):
...
@@ -225,6 +237,10 @@ class WebSocketTest(WebSocketBaseTestCase):
dict
(
close_future
=
self
.
close_future
)),
dict
(
close_future
=
self
.
close_future
)),
(
'/open_coroutine'
,
OpenCoroutineHandler
,
(
'/open_coroutine'
,
OpenCoroutineHandler
,
dict
(
close_future
=
self
.
close_future
,
test
=
self
)),
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
({
],
template_loader
=
DictLoader
({
'message.html'
:
'<b>{{ message }}</b>'
,
'message.html'
:
'<b>{{ message }}</b>'
,
}))
}))
...
@@ -511,6 +527,20 @@ class WebSocketTest(WebSocketBaseTestCase):
...
@@ -511,6 +527,20 @@ class WebSocketTest(WebSocketBaseTestCase):
self
.
assertEqual
(
res
,
'ok'
)
self
.
assertEqual
(
res
,
'ok'
)
yield
self
.
close
(
ws
)
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
):
if
sys
.
version_info
>=
(
3
,
5
):
NativeCoroutineOnMessageHandler
=
exec_test
(
globals
(),
locals
(),
"""
NativeCoroutineOnMessageHandler
=
exec_test
(
globals
(),
locals
(),
"""
...
...
tornado/websocket.py
浏览文件 @
a99f1471
...
@@ -751,10 +751,14 @@ class WebSocketProtocol13(WebSocketProtocol):
...
@@ -751,10 +751,14 @@ class WebSocketProtocol13(WebSocketProtocol):
self
.
stream
=
self
.
handler
.
stream
self
.
stream
=
self
.
handler
.
stream
self
.
start_pinging
()
self
.
start_pinging
()
open_result
=
self
.
_run_callback
(
self
.
handler
.
open
,
*
self
.
handler
.
open_args
,
try
:
**
self
.
handler
.
open_kwargs
)
open_result
=
self
.
handler
.
open
(
*
self
.
handler
.
open_args
,
**
self
.
handler
.
open_kwargs
)
if
open_result
is
not
None
:
if
open_result
is
not
None
:
yield
open_result
yield
open_result
except
Exception
:
self
.
handler
.
log_exception
(
*
sys
.
exc_info
())
self
.
_abort
()
yield
self
.
_receive_frame_loop
()
yield
self
.
_receive_frame_loop
()
def
_parse_extensions_header
(
self
,
headers
):
def
_parse_extensions_header
(
self
,
headers
):
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录