プロキシを特定の 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: :(