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 要求の送信を担当します。テスト目的で、構成は 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: :(

4

0 に答える 0