HTTPURLResponse allHeaderFields Swift 3 Großschreibung

8

Konvertiert nach Swift 3 Ich bemerkte einen seltsamen Fehler beim Lesen eines Headerfeldes von HTTPURLResponse.

%Vor%

hat nicht mehr funktioniert.

Ich habe das "all headers dictionary" ausgedruckt und alle meine Header-Schlüssel scheinen im "sentence case" zu sein.

Laut Charles-Proxy sind alle meine Header in Kleinbuchstaben. Laut dem Backend-Team befinden sich die Header in ihrem Code in Titel-Case. Laut den Dokumenten: Header sollte Groß-und Kleinschreibung nicht beachten.

Also ich weiß nicht, was ich glauben soll. Findet jemand anderes in Swift 3 heraus, dass seine Header nun in Sentence case by iOS umgewandelt werden? Wenn ja, wollen wir dieses Verhalten?

Sollte ich einen Fehler bei Apple protokollieren oder sollte ich einfach eine Kategorie auf HTTPURLResponse machen, damit ich in der Lage bin, einen Header-Wert insensitiv zu finden.

    
Mark Bridges 20.10.2016, 10:57
quelle

7 Antworten

8

Update : Dies ist ein bekanntes Problem .

allHeaderFields sollte ein Wörterbuch ohne Beachtung der Groß- / Kleinschreibung zurückgeben, da dies die HTTP-Spezifikation erfordert. Sieht aus wie ein Swift-Fehler, ich würde einen Radar- oder einen Bug-Bericht einreichen.

Hier ist ein Beispielcode, der das Problem einfach reproduziert:

%Vor%

(Angepasst von diesem Gist von Cédric Lüthi .)

    
Aaron Brager 20.10.2016, 11:06
quelle
3

Basierend auf der Antwort von @ Darko habe ich eine Erweiterung Swift 3 erstellt, mit der Sie alle Header ohne Berücksichtigung der Groß- und Kleinschreibung finden können:

%Vor%     
Ondrej 24.06.2017 22:55
quelle
1

Ich habe dies getroffen und habe mit einer Erweiterung von Dictionary daran gearbeitet, benutzerdefinierte Indizes zu erstellen.

%Vor%

Die Zeitpunkte in den Kommentaren stammen vom Benchmarking verschiedener Szenarien (optimierter Build, -Os , gemittelt über 1.000.000 Iterationen). Ein äquivalenter Zugriff eines Standardwörterbuchs kam bei 1257ns heraus. Zwei Checks effektiv zu verdoppeln, das hat 2412ns.

In meinem speziellen Fall sah ich, dass ein Header vom Server zurückkam, der in Camel-Case oder in Kleinbuchstaben geschrieben war, abhängig vom Netzwerk, mit dem ich mich verband (etwas anderes, das untersucht werden sollte). Der Vorteil davon ist, dass, wenn es behoben wird, ich einfach die Erweiterung löschen kann und nichts anderes ändern muss. Außerdem muss sich jeder, der den Code verwendet, keine Workarounds merken - sie erhalten diese kostenlos.

Ich habe überprüft, dass ETag nicht von HTTPURLResponse geändert wurde - wenn ich es weitergegeben habe ETag oder Etag Ich habe diese in allHeaderFields zurückgeholt. Wenn die Leistung ein Problem darstellt und dieses Problem auftritt, können Sie einen zweiten Index erstellen, der ein Hashable struct mit einem Array enthält. Übergeben Sie es dann an das Wörterbuch mit den Tags, die Sie behandeln möchten.

%Vor%

Dies ist, wie Sie erwarten würden, fast gleichbedeutend mit der Erstellung individueller Wörterbuch-Lookups.

    
StephenG 02.02.2017 01:20
quelle
1

Als Hot-Fix für Swift 3 können Sie dies tun:

%Vor%

UPDATE: Dieses Problem scheint in Swift 4 immer noch nicht behoben zu sein.

    
Darko 02.01.2017 15:08
quelle
0

Es gibt eine etwas kürzere Version als Darko's für swift 3.0.

Aufgrund der Tatsache, dass die Header-Namen Fälle in iOS8 und iOS10 unterschiedlich sein können, ist der beste Weg, einen case-insensitiven Vergleich zu verwenden.

%Vor%

So werden jetzt alle Typen unterstützt:

  • case-insensitive-header
  • Case-Insensitive-Header
  • CASE-INSENSITIVE-HEADER
S0r13n 17.05.2017 11:59
quelle
0

Hier ist meins. Anstatt mit der Funktionsweise des Wörterbuchs herumzuspielen, habe ich eine Obj-c-Kategorie in NSHTTPURLResponse erstellt. Das Obj-C allHeaderFields Dictionary ist immer noch nicht Groß-und Kleinschreibung.

%Vor%     
Paul Bruneau 29.06.2017 19:58
quelle
0

Für die einfache Verwendung

%Vor%     
john07 19.09.2017 09:08
quelle