इसलिए मैं एक ऐसे बवंडर सर्वर का एक परीक्षण कर रहा हूं जिसे मैंने प्रोग्राम किया है जिसमें एक 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

इस परीक्षण के साथ मेरा लक्ष्य यह साबित करना था कि मेरा बवंडर सर्वर गलत प्रमाणीकरण शीर्षलेख के कारण इस वेबसोकेट कनेक्शन को सही ढंग से मना कर देता है और बंद कर देता है। यह मेरा बवंडर 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() को कॉल किया जाता है (सुनिश्चित नहीं है कि मुझे कोड और कारण चाहिए)। यह वेबसोकेट को बंद कर देना चाहिए। लेकिन यह वास्तव में "क्लाइंट" पक्ष में नहीं होता है। मेरे द्वारा "क्लाइंट" में create_connection() को कॉल करने के बाद, ws.connected वेरिएबल अभी भी सही है, और जब मैं ws.send() करता हूं तो websocketHandler की on_message विधि अभी भी कॉल की जाती है। और जब यह self.write_message() के साथ प्रतिक्रिया करने का प्रयास करता है तो यह एक WebSocketClosedError उठाता है। और तभी "क्लाइंट" वास्तव में वेबसोकेट के अपने हिस्से को बंद कर देता है, ws.recv() कुछ भी नहीं लौटाता है और ws.connected उसके बाद गलत हो जाता है। क्या कोई तरीका है जिससे मैं क्लाइंट साइड (हैंडशेक हेडर या कुछ और के माध्यम से) से संवाद कर सकता हूं कि वेबसोकेट को इसके पक्ष में पहले बंद किया जाना है?

0
am.torrinha 31 मई 2019, 16:28

1 उत्तर

सबसे बढ़िया उत्तर

आप open() को ओवरराइड करने और self.close() को कॉल करने के बजाय, prepare() को ओवरराइड कर सकते हैं और tornado.web.HTTPError बढ़ा सकते हैं। यह पहले अवसर पर कनेक्शन को अस्वीकार कर देगा और इसे बाद में पढ़ने के बजाय ग्राहक पक्ष पर create_connection() के हिस्से के रूप में रिपोर्ट किया जाएगा।

0
Ben Darnell 31 मई 2019, 21:30