How to use URLSession with Proxy in Swift 3

前端 未结 2 1723
庸人自扰
庸人自扰 2020-12-31 05:39

For an API Request I\'m trying to setup an URLSession using a Proxy. For test purposes I\'m using a public Proxy and an API responding the IP.

func makeReque         


        
相关标签:
2条回答
  • 2020-12-31 06:04

    I think the working (supposed to be deprecated) keys are:

    kCFStreamPropertyHTTPSProxyHost
    kCFStreamPropertyHTTPSProxyPort
    

    Could you try this code?

    func makeRequestViaUrlSessionProxy(_ url: String, completion: @escaping (_ result: String?) -> ()) {
    
        let request = URLRequest(url: URL(string: url)!)
    
        let config = URLSessionConfiguration.default
        config.requestCachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalCacheData
        config.connectionProxyDictionary = [AnyHashable: Any]()
        config.connectionProxyDictionary?[kCFNetworkProxiesHTTPEnable as String] = 1
        config.connectionProxyDictionary?[kCFNetworkProxiesHTTPProxy as String] = "142.54.173.19"
        config.connectionProxyDictionary?[kCFNetworkProxiesHTTPPort as String] = 8888
        config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyHost as String] = "142.54.173.19"
        config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyPort as String] = 8888
    
        let session = URLSession.init(configuration: config, delegate: nil, delegateQueue: OperationQueue.current)
    
        let task = session.dataTask(with: request) {
            (data: Data?, response: URLResponse?, error: Error?) in
            if error != nil {
                NSLog("Client-side error in request to \(url): \(error)")
                completion(nil)
                return
            }
    
            if data == nil {
                NSLog("Data from request to \(url) is nil")
                completion(nil)
                return
            }
    
            let httpResponse = response as? HTTPURLResponse
            if httpResponse?.statusCode != 200 {
                NSLog("Server-side error in request to \(url): \(httpResponse)")
                completion(nil)
                return
            }
    
            let encodingName = response?.textEncodingName != nil ? response?.textEncodingName : "utf-8"
            let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString!))
            let stringData = String(data: data!, encoding: String.Encoding(rawValue: UInt(encoding)))
            session.invalidateAndCancel()
            completion(stringData)
        }
        task.resume()
    }
    

    Also please make sure your proxy server is configured to handle https requests.

    Note: It might give deprecated warning for those keys but keys are still working (see https://forums.developer.apple.com/thread/19356#131446)

    0 讨论(0)
  • 2020-12-31 06:12

    I am not sure if that make sense. But, there is two defferent set of keys here:

    1. HTTP
    2. HTTPS

    Proxy Keys:

    // http proxy keys
    kCFNetworkProxiesHTTPEnable
    kCFNetworkProxiesHTTPProxy
    kCFNetworkProxiesHTTPPort
    
    // https proxy keys
    kCFNetworkProxiesHTTPSEnable
    kCFNetworkProxiesHTTPSProxy
    kCFNetworkProxiesHTTPSPort
    
    0 讨论(0)
提交回复
热议问题