使用Alamofire Session设置代理

时间:2014-12-25 23:36:19

标签: macos swift proxy alamofire

我正在尝试将代理绑定到特定的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
    }
} 

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

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函数在发送之前拦截请求来尝试一些东西。到目前为止没有运气。

EDIT1: :(

0 个答案:

没有答案