我创建AFHTTPSessionManager
已创建NSURLSessionDownloadTask
用于在应用中下载视频有时,当使用http:80 url进行初始化时,会将其转换为https:443 。这是在进行任何连接尝试之前发生的(我通过NSURLSessionConfiguration
向会话添加了一个自定义HTTP协议类,以便在建立连接时进行记录)。
当请求进入
时-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
我的CustomHTTPProtocolDelegate类的委托方法,请求已更改为https。
禁用App Transport Security(NSAllowsArbitraryLoads=true
)并且此行为似乎与特定的仅http服务器相关联(其他仅限http的服务器没有问题,并且在端口80上建立为http连接)
知道会发生什么事吗?我还能做些什么来调试?
以下是创建下载任务的方式(包括调试自定义协议类):
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionConfiguration* config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
config.protocolClasses = @[[CustomHTTPProtocol class]];
AFHTTPSessionManager *session = [[AFHTTPSessionManager manager] initWithSessionConfiguration:config];
self.downloadTask = [session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response){
...
[UPDATE] 这个问题引起了我们一些麻烦,所以为了帮助进行故障排除,我创建了一个小测试项目来帮助缩小问题范围。我的简单项目做了两件事,将一个url加载到UIWebView中并使用NSURLSessionDownloadTask下载文件。这些操作的网址遵循以下模式: WebView网址:https://console.company.com/home.html 下载网址:http://data.company.com/file.txt 这些主机名解析为不同的IP(不同的服务器)。
如果我在导航webview之前下载文件,那么一切都很好,但如果webview首先加载其URL,则下载URL将自动切换到HTTPS,初始数据请求将失败。我们有一个想法是,一旦iOS为webview正在创建的HTTPS连接打开TLS隧道,它就会尝试为所有后续的* .company.com连接使用相同的隧道。或者至少,它假设所有* .company.com连接也必须是TLS。
答案 0 :(得分:0)
想出来。两台服务器都为所有子域发送HSTS header。由于NSURLSession下的网络层会观察此标头,因此在离开客户端之前,对HTTP服务器的调用将升级为HTTPS。