diff --git a/Sources/AsyncHTTPClient/HTTPClient+HTTPCookie.swift b/Sources/AsyncHTTPClient/HTTPClient+HTTPCookie.swift index c1c044858..ae5d18104 100644 --- a/Sources/AsyncHTTPClient/HTTPClient+HTTPCookie.swift +++ b/Sources/AsyncHTTPClient/HTTPClient+HTTPCookie.swift @@ -81,11 +81,30 @@ extension HTTPClient { case ("domain", .some(let value)): self.domain = value case ("expires", let value): + guard let value = value else { + continue + } + let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US") formatter.timeZone = TimeZone(identifier: "GMT") + formatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss z" - self.expires = value.flatMap { formatter.date(from: $0) } + if let date = formatter.date(from: value) { + self.expires = date + continue + } + + formatter.dateFormat = "EEE, dd-MMM-yy HH:mm:ss z" + if let date = formatter.date(from: value) { + self.expires = date + continue + } + + formatter.dateFormat = "EEE MMM d hh:mm:s yyyy" + if let date = formatter.date(from: value) { + self.expires = date + } case ("max-age", let value): self.maxAge = value.flatMap(Int.init) case ("secure", nil): diff --git a/Tests/AsyncHTTPClientTests/HTTPClientCookieTests+XCTest.swift b/Tests/AsyncHTTPClientTests/HTTPClientCookieTests+XCTest.swift index 255b661de..6e11b389e 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientCookieTests+XCTest.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientCookieTests+XCTest.swift @@ -30,6 +30,7 @@ extension HTTPClientCookieTests { ("testCookieDefaults", testCookieDefaults), ("testCookieInit", testCookieInit), ("testMalformedCookies", testMalformedCookies), + ("testCookieExpiresDateParsing", testCookieExpiresDateParsing), ] } } diff --git a/Tests/AsyncHTTPClientTests/HTTPClientCookieTests.swift b/Tests/AsyncHTTPClientTests/HTTPClientCookieTests.swift index d0b62020a..4227a1ae7 100644 --- a/Tests/AsyncHTTPClientTests/HTTPClientCookieTests.swift +++ b/Tests/AsyncHTTPClientTests/HTTPClientCookieTests.swift @@ -82,4 +82,15 @@ class HTTPClientCookieTests: XCTestCase { XCTAssertNil(HTTPClient.Cookie(header: "=;", defaultDomain: "exampe.org")) XCTAssertNil(HTTPClient.Cookie(header: "=value;", defaultDomain: "exampe.org")) } + + func testCookieExpiresDateParsing() { + var c = HTTPClient.Cookie(header: "key=value; eXpIRes=Sun, 06 Nov 1994 08:49:37 GMT;", defaultDomain: "example.org")! + XCTAssertEqual(Date(timeIntervalSince1970: 784_111_777), c.expires) + + c = HTTPClient.Cookie(header: "key=value; eXpIRes=Sunday, 06-Nov-94 08:49:37 GMT;", defaultDomain: "example.org")! + XCTAssertEqual(Date(timeIntervalSince1970: 784_111_777), c.expires) + + c = HTTPClient.Cookie(header: "key=value; eXpIRes=Sun Nov 6 08:49:37 1994;", defaultDomain: "example.org")! + XCTAssertEqual(Date(timeIntervalSince1970: 784_111_777), c.expires) + } }