Обновление клиента Dart Socket до WebSocket - PullRequest
0 голосов
/ 11 декабря 2018

Поскольку WebSocket в Dart не позволяет напрямую установить SecurityContext (который мне нужен для проверки сертификатов), я хотел бы установить соединение с SecureSocket экземпляра, а затем используйте конструктор WebSocket.fromUpgradedSocket для создания из него экземпляра WebSocket.

Эта идея изначально была предложена здесь .

Однако я незаставить его работать со следующим кодом (хотя я хочу, чтобы wss, даже ws не работал):

sock = await Socket.connect('ws://echo.websocket.org', 80);
socket = WebSocket.fromUpgradedSocket(sock, serverSide: false);
socket.listen(myListener);
// Send some dummy data
var list = utf8.encode("hello");
var data = list is Uint8List ? list : Uint8List.fromList(list);
socket.add(data);

Здесь sock типа Socket, сокет типа WebSocket, а myListener - это функция, которая выводит некоторую отладочную информацию.заявления, когда сообщение было получено.Я не получаю ошибку, но и не попадаю в слушатель - что я делаю, когда заменяю первые две строки этой:

socket = await WebSocket.connect('ws://echo.websocket.org');    

Я предполагаю, что проблема в том, что мой носок Socket ''не обновляется, в то время как исходный код WebSocket для упомянутого конструктора четко гласит: «Создает WebSocket из уже обновленного сокета.».

Так что мой вопрос: возможно ли это?с существующими классами Dart для обновления клиентского (Secure-) Socket до обновленного (Secure-) Socket?(что позволило бы преобразовать его в экземпляр WebSocket)

1 Ответ

0 голосов
/ 11 декабря 2018

С помощью HttpClient установите исходное соединение http (s), а затем detach сокет.Вот пример с http.Вы должны быть в состоянии адаптироваться к https.Обратите внимание, как первоначальное соединение выполняется через http, но обновляется путем добавления соответствующих заголовков запросов.(Вам нужно будет адаптировать заголовки к схеме безопасности, требуемой вашим сервером веб-сокетов.)

  Random r = new Random();
  String key = base64.encode(List<int>.generate(8, (_) => r.nextInt(255)));

  HttpClient client = HttpClient(/* optional security context here */);
  HttpClientRequest request = await client.get('echo.websocket.org', 80,
      '/foo/ws?api_key=myapikey'); // form the correct url here
  request.headers.add('Connection', 'upgrade');
  request.headers.add('Upgrade', 'websocket');
  request.headers.add('sec-websocket-version', '13'); // insert the correct version here
  request.headers.add('sec-websocket-key', key);

  HttpClientResponse response = await request.close();
  // todo check the status code, key etc
  Socket socket = await response.detachSocket();

  WebSocket ws = WebSocket.fromUpgradedSocket(
    socket,
    serverSide: false,
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...