@@ -93,6 +93,47 @@ open class HTTPCookie : NSObject {
9393 let _version : Int
9494 var _properties : [ HTTPCookiePropertyKey : Any ]
9595
96+ // See: https://tools.ietf.org/html/rfc2616#section-3.3.1
97+
98+ // Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
99+ static let _formatter1 : DateFormatter = {
100+ let formatter = DateFormatter ( )
101+ formatter. locale = Locale ( identifier: " en_US_POSIX " )
102+ formatter. dateFormat = " EEE, dd MMM yyyy HH:mm:ss O "
103+ formatter. timeZone = TimeZone ( abbreviation: " GMT " )
104+ return formatter
105+ } ( )
106+
107+ // Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
108+ static let _formatter2 : DateFormatter = {
109+ let formatter = DateFormatter ( )
110+ formatter. locale = Locale ( identifier: " en_US_POSIX " )
111+ formatter. dateFormat = " EEEE, dd-MMM-yy HH:mm:ss O "
112+ formatter. timeZone = TimeZone ( abbreviation: " GMT " )
113+ return formatter
114+ } ( )
115+
116+ // Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
117+ static let _formatter3 : DateFormatter = {
118+ let formatter = DateFormatter ( )
119+ formatter. locale = Locale ( identifier: " en_US_POSIX " )
120+ formatter. dateFormat = " EEE MMM d HH:mm:ss yyyy "
121+ formatter. timeZone = TimeZone ( abbreviation: " GMT " )
122+ return formatter
123+ } ( )
124+
125+ // Sun, 06-Nov-1994 08:49:37 GMT ; Tomcat servers sometimes return cookies in this format
126+ static let _formatter4 : DateFormatter = {
127+ let formatter = DateFormatter ( )
128+ formatter. locale = Locale ( identifier: " en_US_POSIX " )
129+ formatter. dateFormat = " EEE, dd-MMM-yyyy HH:mm:ss O "
130+ formatter. timeZone = TimeZone ( abbreviation: " GMT " )
131+ return formatter
132+ } ( )
133+
134+ static let _allFormatters : [ DateFormatter ]
135+ = [ _formatter1, _formatter2, _formatter3, _formatter4]
136+
96137 static let _attributes : [ HTTPCookiePropertyKey ]
97138 = [ . name, . value, . originURL, . version, . domain,
98139 . path, . secure, . expires, . comment, . commentURL,
@@ -292,12 +333,8 @@ open class HTTPCookie : NSObject {
292333 if let date = expiresProperty as? Date {
293334 expDate = date
294335 } else if let dateString = expiresProperty as? String {
295- let formatter = DateFormatter ( )
296- formatter. locale = Locale ( identifier: " en_US_POSIX " )
297- formatter. dateFormat = " EEE, dd MMM yyyy HH:mm:ss O " // per RFC 6265 '<rfc1123-date, defined in [RFC2616], Section 3.3.1>'
298- let timeZone = TimeZone ( abbreviation: " GMT " )
299- formatter. timeZone = timeZone
300- expDate = formatter. date ( from: dateString)
336+ let results = HTTPCookie . _allFormatters. compactMap { $0. date ( from: dateString) }
337+ expDate = results. first
301338 }
302339 }
303340 _expiresDate = expDate
@@ -418,7 +455,7 @@ open class HTTPCookie : NSObject {
418455 let name = pair. components ( separatedBy: " = " ) [ 0 ]
419456 var value = pair. components ( separatedBy: " \( name) = " ) [ 1 ] //a value can have an "="
420457 if canonicalize ( name) == . expires {
421- value = value. insertComma ( at : 3 ) //re-insert the comma
458+ value = value. unmaskCommas ( ) //re-insert the comma
422459 }
423460 properties [ canonicalize ( name) ] = value
424461 }
@@ -439,7 +476,7 @@ open class HTTPCookie : NSObject {
439476 //we pass this to a map()
440477 private class func removeCommaFromDate( _ value: String ) -> String {
441478 if value. hasPrefix ( " Expires " ) || value. hasPrefix ( " expires " ) {
442- return value. removeCommas ( )
479+ return value. maskCommas ( )
443480 }
444481 return value
445482 }
@@ -623,12 +660,12 @@ fileprivate extension String {
623660 return self . trimmingCharacters ( in: . whitespacesAndNewlines)
624661 }
625662
626- func removeCommas ( ) -> String {
627- return self . replacingOccurrences ( of: " , " , with: " " )
663+ func maskCommas ( ) -> String {
664+ return self . replacingOccurrences ( of: " , " , with: " &comma " )
628665 }
629666
630- func insertComma ( at index : Int ) -> String {
631- return String ( self . prefix ( index ) ) + " , " + String ( self . suffix ( self . count - index ) )
667+ func unmaskCommas ( ) -> String {
668+ return self . replacingOccurrences ( of : " &comma " , with : " , " )
632669 }
633670}
634671
0 commit comments