如何在龙卷风 websocket 处理程序中拒绝 websocket 握手
How to refuse a websocket handshake in a tornado websocket handler
所以我正在对我编写的具有 websocketHandler
的龙卷风服务器进行单元测试。这是我的测试代码:
def test_unauthorized_websocket(self):
message = "Hey bro"
ws = websocket.create_connection('ws://localhost:8888/ws', header=['Authorization: false'])
send_dict = {'command': test_command, 'message': message}
serialized_dict = json.dumps(send_dict)
ws.send(serialized_dict)
response = ws.recv()
#test response with assert
我进行此测试的目的是证明我的 tornado 服务器因身份验证错误而正确拒绝并关闭此 websocket 连接 header。
这是我的龙卷风 websocketHandler
代码:
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
#some code
headers = self.request.headers
try:
auth = headers['Authorization']
except KeyError:
self.close(code = 1002, reason = "Unauthorized websocket")
print("IT'S CLOSED")
return
if auth == "true":
print("Authorized Websocket!")
#some code
else:
print("Unauthorized Websocket... :-(")
self.close(code = 1002, reason = "Unauthorized websocket")
所以当认证错误时,调用self.close()
(不确定我需要代码和原因)。这应该关闭 websocket。但这实际上并没有发生在 "client" 方面。在我调用 "client" 中的 create_connection()
之后, ws.connected
变量仍然是 True,而当我调用 ws.send()
时, websocketHandler
的 on_message
方法是仍然被调用,当它试图用 self.write_message()
做出响应时,它会引发 WebSocketClosedError
。只有这样 "client" 才真正关闭它的 websocket 一侧,ws.recv()
returns 什么都没有,然后 ws.connected
变成 False。
有没有一种方法可以让我与客户端沟通(通过握手 headers 或其他方式)websocket 应该提前关闭?
您可以覆盖 prepare()
并引发 tornado.web.HTTPError
,而不是覆盖 open()
并调用 self.close()
。这将在第一时间拒绝连接,这将作为 create_connection()
的一部分在客户端报告,而不是稍后读取。
所以我正在对我编写的具有 websocketHandler
的龙卷风服务器进行单元测试。这是我的测试代码:
def test_unauthorized_websocket(self):
message = "Hey bro"
ws = websocket.create_connection('ws://localhost:8888/ws', header=['Authorization: false'])
send_dict = {'command': test_command, 'message': message}
serialized_dict = json.dumps(send_dict)
ws.send(serialized_dict)
response = ws.recv()
#test response with assert
我进行此测试的目的是证明我的 tornado 服务器因身份验证错误而正确拒绝并关闭此 websocket 连接 header。
这是我的龙卷风 websocketHandler
代码:
class WebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
#some code
headers = self.request.headers
try:
auth = headers['Authorization']
except KeyError:
self.close(code = 1002, reason = "Unauthorized websocket")
print("IT'S CLOSED")
return
if auth == "true":
print("Authorized Websocket!")
#some code
else:
print("Unauthorized Websocket... :-(")
self.close(code = 1002, reason = "Unauthorized websocket")
所以当认证错误时,调用self.close()
(不确定我需要代码和原因)。这应该关闭 websocket。但这实际上并没有发生在 "client" 方面。在我调用 "client" 中的 create_connection()
之后, ws.connected
变量仍然是 True,而当我调用 ws.send()
时, websocketHandler
的 on_message
方法是仍然被调用,当它试图用 self.write_message()
做出响应时,它会引发 WebSocketClosedError
。只有这样 "client" 才真正关闭它的 websocket 一侧,ws.recv()
returns 什么都没有,然后 ws.connected
变成 False。
有没有一种方法可以让我与客户端沟通(通过握手 headers 或其他方式)websocket 应该提前关闭?
您可以覆盖 prepare()
并引发 tornado.web.HTTPError
,而不是覆盖 open()
并调用 self.close()
。这将在第一时间拒绝连接,这将作为 create_connection()
的一部分在客户端报告,而不是稍后读取。