HTTPDNS关于IP直连HTTPS的问题

iOS下的网络请求大多用的AFNetworking这个库,该库实现了 NSURLSessionDelegate NSURLSessionTaskDelegate的代理方法,
文档里给到的用域名把IP替换回来的方案是在 NSURLSessionTaskDelegate 的回调方法里
AFNetworking因为实现了 NSURLSessionDelegate, 所以关于SSL握手阶段验证证书的回调全部走的 URLSession: didReceiveChallenge: completionHandler: 这个方法,问题是这个方法是没有回传Request的,拿不到对应HTTP请求的header,所以好像没法继续进行了,求版主帮忙看看?


正常是可以这么做的:
NSString * host = [[task.currentRequest allHTTPHeaderFields] objectForKey:@"Host"];
    if (!host) {
        host = task.currentRequest.URL.host;
    }
现在拿不到这个task,也就拿不到request,怎么办捏

展开
收起
kobe1941 2017-08-29 17:41:20 2913 分享 版权
阿里云 AI 助理回答

在AFNetworking中,虽然URLSession:didReceiveChallenge:completionHandler:方法没有直接提供request信息,但你仍然可以通过其他方式间接获取到请求的header信息。具体来说,你可以通过自定义的AFSecurityPolicy来实现对证书验证的控制,并且在这个过程中访问到请求的header。

下面是一个示例步骤,展示如何在AFNetworking中自定义安全策略以访问请求的header:

  1. 创建自定义的AFSecurityPolicy子类:首先,你需要创建一个AFSecurityPolicy的子类,在这个子类中覆盖或扩展处理SSL握手和证书验证的方法。
#import <AFNetworking/AFSecurityPolicy.h>

@interface CustomSecurityPolicy : AFSecurityPolicy

@end

@implementation CustomSecurityPolicy

// 重写或新增方法以处理证书验证并访问Request的Header
// 注意:这里的代码是示意性的,实际逻辑需要根据你的需求调整

- (void)evaluateServerTrust:(nullable SecTrustRef)serverTrust
                 forDomain:(NSString *)domain
             completionHandler:(void(^)(BOOL trusted, NSError * _Nullable error))completionHandler {
    // 在这里,你可以在执行验证之前获取到当前的请求
    id<NSURLSessionTaskDelegate> taskDelegate = self.manager.session.delegate;
    if ([taskDelegate respondsToSelector:@selector(urlSession:task:didReceiveChallenge:completionHandler:)]) {
        NSURLSessionTask *currentTask = ...; // 这里需要一种方式来获取当前正在进行的task,这可能需要你维护一个task的引用或者通过其他机制
        if (currentTask) {
            NSDictionary *headerFields = currentTask.currentRequest.allHTTPHeaderFields;
            NSString *host = headerFields[@"Host"];
            // 现在你有了header信息,可以进行后续操作
        }
    }

    // 继续执行默认的证书验证逻辑或者你自定义的逻辑
    [super evaluateServerTrust:serverTrust forDomain:domain completionHandler:completionHandler];
}

@end
  1. 使用自定义的安全策略:在你的网络请求设置中,使用这个自定义的CustomSecurityPolicy
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"https://your-base-url"]];
manager.securityPolicy = [[CustomSecurityPolicy alloc] init];
// 其他配置...

请注意,上述代码中的currentTask变量获取可能是个挑战,因为直接在evaluateServerTrust:forDomain:completionHandler:方法中不容易直接获得当前执行任务的引用。这通常需要你在发起请求时保存对任务的引用,或者探索AFNetworking内部是否有可利用的机制来间接获取。如果直接获取NSURLSessionTask对象有困难,可能需要考虑是否有必要在该阶段访问请求头,或者寻找其他途径来满足你的需求。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

阿里云云解析DNS产品相关资讯

还有其他疑问?
咨询AI助理