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