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