@@ -12,6 +12,7 @@ class TestHTTPCookie: XCTestCase {
12
12
static var allTests : [ ( String , ( TestHTTPCookie ) -> ( ) throws -> Void ) ] {
13
13
return [
14
14
( " test_BasicConstruction " , test_BasicConstruction) ,
15
+ ( " test_cookieDomainCanonicalization " , test_cookieDomainCanonicalization) ,
15
16
( " test_RequestHeaderFields " , test_RequestHeaderFields) ,
16
17
( " test_cookiesWithResponseHeader1cookie " , test_cookiesWithResponseHeader1cookie) ,
17
18
( " test_cookiesWithResponseHeader0cookies " , test_cookiesWithResponseHeader0cookies) ,
@@ -303,6 +304,53 @@ class TestHTTPCookie: XCTestCase {
303
304
}
304
305
}
305
306
307
+ func test_cookieDomainCanonicalization( ) throws {
308
+ do {
309
+ let headers = [
310
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/; domain=eXample.com "
311
+ ]
312
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://eXample.com " ) . unwrapped ( ) )
313
+ XCTAssertEqual ( cookies. count, 1 )
314
+ XCTAssertEqual ( cookies. first? . domain, " .example.com " )
315
+ }
316
+
317
+ do {
318
+ let headers = [
319
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/; domain=.eXample.com "
320
+ ]
321
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://eXample.com " ) . unwrapped ( ) )
322
+ XCTAssertEqual ( cookies. count, 1 )
323
+ XCTAssertEqual ( cookies. first? . domain, " .example.com " )
324
+ }
325
+
326
+ do {
327
+ let headers = [
328
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/; domain=a.eXample.com "
329
+ ]
330
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://a.eXample.com " ) . unwrapped ( ) )
331
+ XCTAssertEqual ( cookies. count, 1 )
332
+ XCTAssertEqual ( cookies. first? . domain, " .a.example.com " )
333
+ }
334
+
335
+ do {
336
+ let headers = [
337
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/ "
338
+ ]
339
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://a.eXample.com " ) . unwrapped ( ) )
340
+ XCTAssertEqual ( cookies. count, 1 )
341
+ XCTAssertEqual ( cookies. first? . domain, " a.example.com " )
342
+ }
343
+
344
+ do {
345
+ let headers = [
346
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/; domain=1.2.3.4 "
347
+ ]
348
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://eXample.com " ) . unwrapped ( ) )
349
+ XCTAssertEqual ( cookies. count, 1 )
350
+ XCTAssertEqual ( cookies. first? . domain, " 1.2.3.4 " )
351
+ }
352
+ }
353
+
306
354
func test_cookieExpiresDateFormats( ) {
307
355
let testDate = Date ( timeIntervalSince1970: 1577881800 )
308
356
let cookieString =
@@ -320,7 +368,7 @@ class TestHTTPCookie: XCTestCase {
320
368
XCTAssertEqual ( cookies. count, 3 )
321
369
cookies. forEach { cookie in
322
370
XCTAssertEqual ( cookie. expiresDate, testDate)
323
- XCTAssertEqual ( cookie. domain, " swift.org " )
371
+ XCTAssertEqual ( cookie. domain, " . swift.org" )
324
372
XCTAssertEqual ( cookie. path, " / " )
325
373
}
326
374
}
@@ -333,4 +381,11 @@ class TestHTTPCookie: XCTestCase {
333
381
XCTFail ( " Unable to create cookie with substring " )
334
382
}
335
383
}
384
+
385
+ private func formattedCookieTime( sinceNow seconds: TimeInterval ) -> String {
386
+ let f = DateFormatter ( )
387
+ f. timeZone = TimeZone ( abbreviation: " GMT " )
388
+ f. dateFormat = " EEEE',' dd'-'MMM'-'yy HH':'mm':'ss z "
389
+ return f. string ( from: Date ( timeIntervalSinceNow: seconds) )
390
+ }
336
391
}
0 commit comments