Как правильно использовать 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.