URLSession пропускает метод управления перенаправлением делегата - PullRequest
0 голосов
/ 15 марта 2020

Я отправляю DataTask на какой-то веб-сайт, и в URL я перенаправляю на localhost (https://...&redirect_uri=http://localhost...). В целом в этом вызове я получаю около 5 перенаправлений, где localhost, вероятно, занимает третье место, и после этого перенаправления localhost сохраняет в своей URL важную строку, которую я хочу принять, поэтому я решил предотвратить перенаправления, когда URL будет начинаться с localhost и его дальнейшая спецификация c URL:

extension MyClass: URLSessionTaskDelegate {
  func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
    if response.url?.absoluteString.hasPrefix("http://localhost/bar?code=") ?? false {
      completionHandler(nil)
    }
    completionHandler(request)
  }

, и я установил делегат моего объекта URLSession в качестве этого класса:

  private var session: URLSession { URLSession(configuration: .default, delegate: self, delegateQueue: nil) } // `self` is MyClass

После отправки запроса, упомянутого в начале вопроса, XCode выдает эту ошибку:

Task <UIID>.<1> finished with error [-1004] Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." UserInfo={NSUnderlyingError=0x600000cc46f0 {Error Domain=kCFErrorDomainCFNetwork Code=-1004 "(null)" UserInfo={_kCFStreamErrorCodeKey=61, _kCFStreamErrorDomainKey=1}}, NSErrorFailingURLStringKey=http://localhost/bar?code=[code], NSErrorFailingURLKey=http://localhost/bar?code=[code], _kCFStreamErrorDomainKey=1, _kCFStreamErrorCodeKey=61, NSLocalizedDescription=Could not connect to the server.}

Как видите, этот метод делегата не вызывается (я дополнительно проверил это с помощью точек останова). Я обнаружил, что некоторые другие методы этого делегата не запускаются, когда я использую замыкание на dataTask(with:), но он не применяется к методу обработки перенаправления (я проверил это, я удалил замыкания, и он до сих пор не звонил).

Дополнительная информация:

Запрос создается как здесь:

let url = URL(string: https://...)
var request = URLRequest(url: url)

request.addValue([someValue], forHTTPHeaderField: "User-Agent")

И это моя задача:

let task = session.dataTask(with: request) // Request created like above
task.resume()

И будет Методы объединения (.dataTaskPubliser ()) применяются к этому делегату?

...