Slide 61
Slide 61 text
struct HTTPRedirectResolver {
func resolve(_ url: URL) async throws -> URL? {
try await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in
let delegate = Delegate(activeContinuation: continuation)
let urlSession = URLSession(configuration: .default, delegate: delegate, delegateQueue: nil)
let request = URLRequest(url: url)
urlSession.dataTask(with: request).resume()
}
}
private class Delegate: NSObject, URLSessionDataDelegate {
private let activeContinuation: CheckedContinuation
init(activeContinuation: CheckedContinuation) {
self.activeContinuation = activeContinuation
}
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
let newURL = request.url
activeContinuation.resume(returning: newURL)
completionHandler(nil)
}
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
activeContinuation.resume(returning: dataTask.currentRequest?.url)
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
guard let error = error else {
return activeContinuation.resume(returning: nil)
}
activeContinuation.resume(throwing: error)
}
}
}
61