3

我正在尝试将代理绑定到特定的 http 请求。所以我创建了一个如下所述的代理类,它获取一个代理并使用 kCF 属性绑定它。

class Proxy {

     func configureProxy(proxy: String) -> NSURLSessionConfiguration {
        let proxyArr = proxy.componentsSeparatedByString(":")

        let host = proxyArr[0]
        let port = proxyArr[1].toInt()

        if let p  = port{
            return newSession(host, port: p)
        }

        return NSURLSessionConfiguration.defaultSessionConfiguration()
    }

     func newSession(host: String, port: Int) -> NSURLSessionConfiguration  {


        let proxyInfo = [
            kCFStreamPropertyHTTPProxyHost : host as NSString,
            kCFStreamPropertyHTTPProxyPort : port,
            kCFNetworkProxiesHTTPEnable as NSString : true
        ]

        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        config.connectionProxyDictionary = proxyInfo


        return config
    }
} 

这是我的服务类,它接收来自任何扩展它的服务类的请求。EG(HttpBin:服务)。完成所有设置后,包括正确的路由器(只是一个 mutableUrlRequest),服务类负责发送 http 请求。出于测试目的,配置是在服务类的初始化期间完成的。

class Service {

    var res      = ResponseHandler()
    var alamofireManager : Alamofire.Manager?


    init(){
        let ipconfig = Proxy()
        let config = ipconfig.configureProxy(VALIDPROXY)
        alamofireManager = Alamofire.Manager(configuration: config)
    }

    func createRequest(Router : routes, type : String, completion:(response: ResponseHandler) -> Void){

        if let manager = alamofireManager {
            println(manager.session.configuration.connectionProxyDictionary)

        switch(type){
            case "download":
                manager.request(Router).responseImage() {
                    (_, _, image, error) in

                    self.res.image   = image
                    self.res.success = true
                    completion(response: self.res)
                }
                break;
            case "upload":
                manager.upload(Router, data: uploadData)
                    .responseJSON { (request,response, JSON, error) in
                        self.res = self.getResponse(JSON, error : error)
                    }.responseString{ (_,_,string,error) in
                        if (error != nil){
                            println(error)
                        }
                        self.res.responseString = string
                        completion(response: self.res)
            }
            default:
                manager.request(Router)
                    .responseJSON { (request,response, JSON, error) in
                        self.res = self.getResponse(JSON, error : error)
                    }.responseString{ (_,_,string,error) in
                        self.res.responseString = string
                        println(error)
                        println(string)
                        completion(response: self.res)
            }
        }
        }

    }


    func getResponse(serverData : AnyObject?, error: NSError?)-> ResponseHandler{

        if let data: AnyObject = serverData {

            self.res.response = SwiftyJSON.JSON(data.0)
            if(error == nil){
                self.res.success = true
            }
            else{
                self.res.error   = error
                println(error)
            }
        }
        return self.res
    }
}

在点击我的测试 api 后,请求中的客户端 ip 似乎是我的 ip 而不是从 proxyInfo 字典创建的。manager.session.configuration.connectionProxyDictionary 打印字典中设置的值。如果 Alamofire 框架中的某些东西阻止了这种情况,或者我的实现有什么问题,有什么想法吗?

编辑:

我正在尝试通过实现 NSURLProtocol 并使用 CFReadStreamSetProperty 函数在发送请求之前拦截请求。到目前为止还没有运气。

编辑1::(

4

0 回答 0