@@ -35,7 +35,6 @@ open class URLResponse : NSObject, NSSecureCoding, NSCopying, @unchecked Sendabl
35
35
guard let nsurl = aDecoder. decodeObject ( of: NSURL . self, forKey: " NS.url " ) else { return nil }
36
36
self . url = nsurl as URL
37
37
38
-
39
38
if let mimetype = aDecoder. decodeObject ( of: NSString . self, forKey: " NS.mimeType " ) {
40
39
self . mimeType = mimetype as String
41
40
}
@@ -46,12 +45,9 @@ open class URLResponse : NSObject, NSSecureCoding, NSCopying, @unchecked Sendabl
46
45
self . textEncodingName = encodedEncodingName as String
47
46
}
48
47
49
- if let encodedFilename = aDecoder. decodeObject ( of: NSString . self, forKey: " NS.suggestedFilename " ) ? . lastPathComponent,
50
- !encodedFilename. isEmpty {
51
- self . suggestedFilename = encodedFilename
52
- } else {
53
- self . suggestedFilename = " Unknown "
54
- }
48
+ // re-sanitizing with lastPathComponent because of supportsSecureCoding
49
+ let encodedFilename = aDecoder. decodeObject ( of: NSString . self, forKey: " NS.suggestedFilename " ) ? . lastPathComponent
50
+ self . suggestedFilename = encodedFilename? . isEmpty != false ? " Unknown " : encodedFilename
55
51
}
56
52
57
53
open func encode( with aCoder: NSCoder ) {
@@ -180,6 +176,25 @@ open class URLResponse : NSObject, NSSecureCoding, NSCopying, @unchecked Sendabl
180
176
/// protocol responses.
181
177
open class HTTPURLResponse : URLResponse , @unchecked Sendable {
182
178
179
+ private static func sanitize( headerFields: [ String : String ] ? ) -> [ String : String ] {
180
+ // Canonicalize the header fields by capitalizing the field names, but not X- Headers
181
+ // This matches the behaviour of Darwin.
182
+ guard let headerFields = headerFields else { return [ : ] }
183
+ var canonicalizedFields : [ String : String ] = [ : ]
184
+
185
+ for (key, value) in headerFields {
186
+ if key. isEmpty { continue }
187
+ if key. hasPrefix ( " x- " ) || key. hasPrefix ( " X- " ) {
188
+ canonicalizedFields [ key] = value
189
+ } else if key. caseInsensitiveCompare ( " WWW-Authenticate " ) == . orderedSame {
190
+ canonicalizedFields [ " WWW-Authenticate " ] = value
191
+ } else {
192
+ canonicalizedFields [ key. capitalized] = value
193
+ }
194
+ }
195
+ return canonicalizedFields
196
+ }
197
+
183
198
/// Initializer for HTTPURLResponse objects.
184
199
///
185
200
/// - Parameter url: the URL from which the response was generated.
@@ -189,30 +204,13 @@ open class HTTPURLResponse : URLResponse, @unchecked Sendable {
189
204
/// - Returns: the instance of the object, or `nil` if an error occurred during initialization.
190
205
public init ? ( url: URL , statusCode: Int , httpVersion: String ? , headerFields: [ String : String ] ? ) {
191
206
self . statusCode = statusCode
192
-
193
- self . _allHeaderFields = {
194
- // Canonicalize the header fields by capitalizing the field names, but not X- Headers
195
- // This matches the behaviour of Darwin.
196
- guard let headerFields = headerFields else { return [ : ] }
197
- var canonicalizedFields : [ String : String ] = [ : ]
198
-
199
- for (key, value) in headerFields {
200
- if key. isEmpty { continue }
201
- if key. hasPrefix ( " x- " ) || key. hasPrefix ( " X- " ) {
202
- canonicalizedFields [ key] = value
203
- } else if key. caseInsensitiveCompare ( " WWW-Authenticate " ) == . orderedSame {
204
- canonicalizedFields [ " WWW-Authenticate " ] = value
205
- } else {
206
- canonicalizedFields [ key. capitalized] = value
207
- }
208
- }
209
- return canonicalizedFields
210
- } ( )
211
-
207
+
208
+ self . _allHeaderFields = HTTPURLResponse . sanitize ( headerFields: headerFields)
209
+
212
210
super. init ( url: url, mimeType: nil , expectedContentLength: 0 , textEncodingName: nil )
213
- expectedContentLength = getExpectedContentLength ( fromHeaderFields: headerFields ) ?? - 1
214
- suggestedFilename = getSuggestedFilename ( fromHeaderFields: headerFields ) ?? " Unknown "
215
- if let type = ContentTypeComponents ( headerFields: headerFields ) {
211
+ expectedContentLength = getExpectedContentLength ( fromHeaderFields: _allHeaderFields ) ?? - 1
212
+ suggestedFilename = getSuggestedFilename ( fromHeaderFields: _allHeaderFields ) ?? " Unknown "
213
+ if let type = ContentTypeComponents ( headerFields: _allHeaderFields ) {
216
214
mimeType = type. mimeType. lowercased ( )
217
215
textEncodingName = type. textEncoding? . lowercased ( )
218
216
}
@@ -225,13 +223,18 @@ open class HTTPURLResponse : URLResponse, @unchecked Sendable {
225
223
226
224
self . statusCode = aDecoder. decodeInteger ( forKey: " NS.statusCode " )
227
225
228
- if aDecoder. containsValue ( forKey: " NS.allHeaderFields " ) {
229
- self . _allHeaderFields = aDecoder. decodeObject ( of: NSDictionary . self, forKey: " NS.allHeaderFields " ) as! [ String : String ]
230
- } else {
231
- self . _allHeaderFields = [ : ]
232
- }
226
+ // re-sanitizing dictionary because of supportsSecureCoding
227
+ self . _allHeaderFields = HTTPURLResponse . sanitize ( headerFields: aDecoder. decodeObject ( of: NSDictionary . self, forKey: " NS.allHeaderFields " ) as? [ String : String ] )
233
228
234
229
super. init ( coder: aDecoder)
230
+
231
+ // re-sanitizing from _allHeaderFields because of supportsSecureCoding
232
+ expectedContentLength = getExpectedContentLength ( fromHeaderFields: _allHeaderFields) ?? - 1
233
+ suggestedFilename = getSuggestedFilename ( fromHeaderFields: _allHeaderFields) ?? " Unknown "
234
+ if let type = ContentTypeComponents ( headerFields: _allHeaderFields) {
235
+ mimeType = type. mimeType. lowercased ( )
236
+ textEncodingName = type. textEncoding? . lowercased ( )
237
+ }
235
238
}
236
239
237
240
open override func encode( with aCoder: NSCoder ) {
0 commit comments