Swift中如何在URLSession跟随重定向时自动添加反向代理
在Swift中处理带反向代理的多步重定向下载
要实现每一步重定向都给请求加上反向代理,完全可以通过URLSession的重定向代理回调手动修改请求,具体实现如下:
核心实现思路
利用URLSessionTaskDelegate协议中的urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)方法——每次请求触发重定向时,系统都会调用这个方法,你可以在这里修改重定向目标URL,替换为带反向代理的地址后,让请求继续执行。
代码示例
class DownloadProxyHandler: NSObject, URLSessionTaskDelegate { func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) { // 取出重定向的目标URL guard let originalRedirectUrl = request.url else { // 无法获取URL时取消重定向 completionHandler(nil) return } // 构造带反向代理的URL var proxyComponents = URLComponents() proxyComponents.scheme = "https" proxyComponents.host = "reverse-proxy" // 按需求将原URL的完整内容(去掉scheme前缀)作为代理路径的一部分 let originalUrlPath = originalRedirectUrl.absoluteString.replacingOccurrences(of: "\(originalRedirectUrl.scheme)://", with: "") proxyComponents.path = "/\(originalUrlPath)" guard let proxyUrl = proxyComponents.url else { completionHandler(nil) return } // 构造新请求,替换为代理URL var proxyRequest = request proxyRequest.url = proxyUrl // 继续执行修改后的重定向请求 completionHandler(proxyRequest) } } // 使用示例 let proxyHandler = DownloadProxyHandler() let session = URLSession(configuration: .default, delegate: proxyHandler, delegateQueue: .main) let originalRequest = URLRequest(url: URL(string: "https://初始下载地址")!) let downloadTask = session.downloadTask(with: originalRequest) downloadTask.resume()
关键注意点
- 默认情况下
URLSession允许重定向,无需额外配置;如果手动设置了configuration.allowsRedirects = false,则不会触发重定向回调。 - 必须处理URL构造失败的边界情况,避免因无效URL导致请求中断。
- 如果反向代理需要特定请求头(比如认证信息),可以在构造
proxyRequest时通过setValue(_:forHTTPHeaderField:)添加。
内容的提问来源于stack exchange,提问作者Ch'en Meng
相关产品推荐
相关产品推荐

