Как настроить список подпротоколов для клиента (Twisted)

Привет всем,

Я создал клиента и сервер для связи через веб-сокеты. Для веб-сокетов используется библиотека Twisted, и в конечном итоге я буду отправлять строки GraphQL с клиента на сервер.

Тем не менее, я получаю сообщение об ошибке:

failing WebSocket opening handshake ('subprotocol selected by server (graphql-ws) not in subprotocol list requested by client ([])')

Вот пример кода, который я создал:

server.py

class MyServerProtocol(WebSocketServerProtocol):

  def onConnect(self, request):
    custom_header = {}
    if request.headers['sec-websocket-key']:
      custom_header['sec-websocket-protocol'] = 'graphql-ws'
    return (None, custom_header)

  def onOpen(self):
    print "Websocket connection open"

  def onMessage(self, payload, isBinary):
    # Handle GraphQL query string here
    try:
      parsed_message = json.loads(payload)
    except Exception as exp:
      logger.error('Could not parse websocket payload', exc_info=True)
      self.sendClose()
      return 1

  def onClose(self, wasClean, code, reason):
    print("WebSocket connection closed: {0}".format(reason))

client.py

class MyClientProtocol(WebSocketClientProtocol):

  def onConnect(self, response):
    response.protocol = 'graphql-ws'

  def onOpen(self):
    print "Websocket connection open"

  def onMessage(self, payload, isBinary):
    if isBinary:
        print("Binary message received: {0} bytes".format(len(payload)))
    else:
        print("Text message received: {0}".format(payload.decode('utf8')))

  def onClose(self, wasClean, code, reason):
    print("WebSocket connection closed: {0}".format(reason))

Кто-нибудь знает, как настроить список подпротоколов на стороне клиента? Любая помощь будет принята с благодарностью.

Спасибо,

Брайан

1 ответ

После создания фабрики вы можете добавлять собственные подпротоколы:

factory = WebSocketClientFactory("wss://SERVER_URL")
factory.protocol = MyClientProtocol

# append custom protocols here:
factory.protocols.append("graphql-ws")

connectWS(factory)

Будьте осторожны с буквами "s" (протокол <=> протоколы). Вы можете проверить, был ли протокол принят сервером в ответе метода onConnect:

def OnConnect(self, response):
     print(response)

output: {"peer" : "...", "headers" : { ... }, "protocol": "graphql-ws", ...}

Новый параметр WebSocket( Url, Protocol[]) является необязательным. Проверьте допустимые символы в параметре протокола. Второй - строка или строка [] . Я не уверен, если вы попросите об этом.

Другие вопросы по тегам