如何在龙卷风 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() 时, websocketHandleron_message 方法是仍然被调用,当它试图用 self.write_message() 做出响应时,它会引发 WebSocketClosedError。只有这样 "client" 才真正关闭它的 websocket 一侧,ws.recv() returns 什么都没有,然后 ws.connected 变成 False。 有没有一种方法可以让我与客户端沟通(通过握手 headers 或其他方式)websocket 应该提前关闭?

您可以覆盖 prepare() 并引发 tornado.web.HTTPError,而不是覆盖 open() 并调用 self.close()。这将在第一时间拒绝连接,这将作为 create_connection() 的一部分在客户端报告,而不是稍后读取。