2017-06-29 3 views
5

Ich habe ein AFHTTPSessionManager erstellt NSURLSessionDownloadTask ein Video innerhalb einer App, die manchmal wenn sie mit einem http initialisiert zum Download verwendet wird: 80 url es https konvertiert: 443. Dies geschieht, bevor ein Verbindungsversuch unternommen wird (Ich habe der Sitzung eine benutzerdefinierte HTTP-Protokollklasse über NSURLSessionConfiguration hinzugefügt, um zu protokollieren, wann die Verbindung hergestellt wird).NSURLSessionDownloadTask von http Umstellung auf https

Als die Anfrage an die

-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response 

Delegatmethode meiner CustomHTTPProtocolDelegate Klasse macht, hat die Anforderung an https geändert.

App-Transportsicherheit ist deaktiviert (NSAllowsArbitraryLoads=true) und dieses Verhalten scheint mit einem bestimmten http-only-Server verknüpft zu sein (andere http-only-Server haben kein Problem, und die Verbindung wird als http auf Port 80 hergestellt).

Irgendeine Idee von was könnte los sein? Kann ich noch etwas zum Debuggen tun?

Hier ist, wie die Download-Aufgabe (einschließlich der Debug-benutzerdefinierte Protokollklasse) erstellt wird:

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] uns Dieses Problem eine Reihe von Kopfschmerzen verursacht, Um die Fehlerbehebung zu erleichtern, habe ich ein kleines Testprojekt erstellt, um das Problem einzugrenzen. Mein einfaches Projekt führt zwei Dinge aus, lädt eine URL in ein UIWebView und lädt eine Datei mit NSURLSessionDownloadTask herunter. Die URLs für diese Aktionen folgen diesem Muster: WebView-URL: https://console.company.com/home.html Download-URL: http://data.company.com/file.txt Und diese Hostnamen auf verschiedene IPs (verschiedene Server) auflösen.

Wenn ich die Datei vor der Navigation im Webview herunterlade, ist alles in Ordnung, aber wenn die Webansicht zuerst ihre URL lädt, wird die Download-URL automatisch auf HTTPS umgestellt und die anfängliche Anfrage nach Daten wird fehlschlagen. Ein Gedanke, den wir hatten, war, dass, sobald iOS einen TLS-Tunnel für die HTTPS-Verbindung öffnet, die die Webansicht erstellt, dass es versucht, denselben Tunnel für alle nachfolgenden * .company.com-Verbindungen zu verwenden. Zumindest geht es davon aus, dass alle * .company.com-Verbindungen auch TLS sein müssen.

+0

Ist es möglich, dass der Server https erzwingt? Oder vielleicht ein HSTS Max-Time-Problem? Haben Sie auch versucht, was passiert, wenn Sie nicht AFNetworking, sondern eine normale iOS-Sitzung verwenden? Ich bin mir nicht sicher, aber vielleicht macht die neueste Version von AFNetworking einige clevere Spielereien (unwahrscheinlich, aber ich habe es nicht überprüft). HHTPS ist eine gute Sache (also ich denke, es ist klar, Sie sollten es nur verwenden, wenn Ihr Server es unterstützt), aber das ist wahrscheinlich neben der Frage. – Gero

+0

Der Server unterstützt überhaupt keine https. http-only content server, und es kann nicht auf https umgestellt werden. Ich habe es mit NSURLSession statt AFNetworking neu implementiert, aber ich bekomme das gleiche Verhalten. Soweit ich das beurteilen kann, findet der Wechsel von http zu https statt, bevor die Anfrage über das Netzwerk ausgeht. Etwas in den Tiefen von CoreFoundation. – mreynolds0404

+0

Können Sie Daten von Ihrem API-Aufruf abrufen? –

Antwort

0

Ich habe es herausgefunden. Beide Server sendeten eine HSTS header für alle Subdomains. Da die Netzwerkschicht unter NSURLSession diesen Header überwacht, wurden die Aufrufe des HTTP-Servers vor dem Verlassen des Clients auf HTTPS aktualisiert.