Как правильно использовать URLSessionWebSocketTask + URLProtocol

HTTP-соединение + URLProtocol работает нормально. Но теперь я пытаюсь включить веб-сокеты в эту схему, и это не сработало. Вот уровень веб-сокетов:

      var urlSession =  URLSession(configuration: myConfiguration, delegate: nil, delegateQueue: .main)  
var urlSessionWebSocketTask = urlSession.webSocketTask(with: URL(string: "ws://..." ))
urlSessionWebSocketTask.receive(completionHandler: { result in  ... }
urlSessionWebSocketTask.resume() 

возобновить () из URLSessionWebSocketTask запускает процесс подключения. На уровне URLProtocol я перехватываю этот URLRequest, отправляю его на сервер и получаю URL-ответ протокола переключения с сообщением (данными) веб-сокета.

Вот переопределение метода URLProtocol:

      open class MyProtocol: URLProtocol {
     ....     
override open func startLoading() { 

    // Get response and data here...  
     
     self.client.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed)
     self.client.urlProtocol(self, didLoad: data)
     self.client.urlProtocolDidFinishLoading(self)
}     
}

Я вызываю три метода URLProtocol для возврата данных, а затем получаю ошибки:

  • webSocket: соединение не установлено до получения ответа, сбой задачи
  • webSocket[] Задача <>.<> завершена с ошибкой [-1005] Error Domain=NSURLErrorDomain Code=-1005 "Сетевое соединение было потеряно.

В чем проблема? Что-то с возвратом результата обратно в WebSocketTask, но я не понимаю, что я делаю не так. Мой вопрос: как использовать веб-сокеты + URLProtocol вместе?

Был бы признателен за любую помощь

Я уверен, что у меня есть правильный URLResponse и сообщение веб-сокета. Я проверил это с помощью разных http-клиентов и Wireshark. Поля заголовка, такие как «Sec-WebSocket-Accept» в запросах и ответах, соответствуют RFC 6455.

0 ответов

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