URLSession didReceiveData не вызывается в чанкованном запросе - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь прослушать данные из сервиса dweet.io .Я использую listen метод для получения данных в режиме реального времени.Он использует фрагментированные HTTP-ответы .

Я создал для этого простой сетевой менеджер

import Foundation

class NetworkManager: NSObject, URLSessionDataDelegate {
    private lazy var session = URLSession(configuration: .default, delegate: self, delegateQueue: .main)
    private lazy var task = self.session
        .dataTask(with: URL(string: "https://dweet.io/listen/for/dweets/from/opposite-carpenter")!)

    func start() {
        self.task.resume()
    }

// THIS METHOD IS NEVER CALLED
    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
        print(data)
    }

    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
        print(error!.localizedDescription)
    }

    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
        print(response)
        completionHandler(.allow)
    }
}

При запуске я никогда не получаю данные.Однако я получаю ответ с 200 кодами статуса и заголовками.И примерно через минуту я получаю ошибку The network connection was lost.

Одновременно я использую curl для того же самого.И он получает данные, как ожидалось.

curl -i "https://dweet.io/listen/for/dweets/from/subdued-nation"

Еще одна вещь, которая меня смутила, заключается в том, что приложение iOS и curl показывают разные значения в поле Transfer-Encoding в заголовках:

UrlSession возвращает "Transfer-Encoding" : "Identity".

В то же время curl показывает Transfer-Encoding: chunked (что ожидается).

Я пытался применить подход, описанный в в этом ответе , но получил тот же результат.

1 Ответ

0 голосов
/ 05 марта 2019

Я собираюсь догадаться, что проблема в фразе URLSession(configuration: .default.При использовании конфигурации default время ожидания истекает через одну минуту.По-видимому, это не то, что вы хотите.

...