@@ -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) ,
@@ -171,6 +172,53 @@ class TestHTTPCookie: XCTestCase {
171
172
XCTAssertEqual ( cookies [ 0 ] . path, " / " )
172
173
}
173
174
175
+ func test_cookieDomainCanonicalization( ) throws {
176
+ do {
177
+ let headers = [
178
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/; domain=eXample.com "
179
+ ]
180
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://eXample.com " ) . unwrapped ( ) )
181
+ XCTAssertEqual ( cookies. count, 1 )
182
+ XCTAssertEqual ( cookies. first? . domain, " .example.com " )
183
+ }
184
+
185
+ do {
186
+ let headers = [
187
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/; domain=.eXample.com "
188
+ ]
189
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://eXample.com " ) . unwrapped ( ) )
190
+ XCTAssertEqual ( cookies. count, 1 )
191
+ XCTAssertEqual ( cookies. first? . domain, " .example.com " )
192
+ }
193
+
194
+ do {
195
+ let headers = [
196
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/; domain=a.eXample.com "
197
+ ]
198
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://a.eXample.com " ) . unwrapped ( ) )
199
+ XCTAssertEqual ( cookies. count, 1 )
200
+ XCTAssertEqual ( cookies. first? . domain, " .a.example.com " )
201
+ }
202
+
203
+ do {
204
+ let headers = [
205
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/ "
206
+ ]
207
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://a.eXample.com " ) . unwrapped ( ) )
208
+ XCTAssertEqual ( cookies. count, 1 )
209
+ XCTAssertEqual ( cookies. first? . domain, " a.example.com " )
210
+ }
211
+
212
+ do {
213
+ let headers = [
214
+ " Set-Cookie " : " PREF=a=b; expires= \( formattedCookieTime ( sinceNow: 100 ) ) ); path=/; domain=1.2.3.4 "
215
+ ]
216
+ let cookies = HTTPCookie . cookies ( withResponseHeaderFields: headers, for: try URL ( string: " http://eXample.com " ) . unwrapped ( ) )
217
+ XCTAssertEqual ( cookies. count, 1 )
218
+ XCTAssertEqual ( cookies. first? . domain, " 1.2.3.4 " )
219
+ }
220
+ }
221
+
174
222
func test_cookieExpiresDateFormats( ) {
175
223
let testDate = Date ( timeIntervalSince1970: 1577881800 )
176
224
let cookieString =
@@ -188,7 +236,7 @@ class TestHTTPCookie: XCTestCase {
188
236
XCTAssertEqual ( cookies. count, 3 )
189
237
cookies. forEach { cookie in
190
238
XCTAssertEqual ( cookie. expiresDate, testDate)
191
- XCTAssertEqual ( cookie. domain, " swift.org " )
239
+ XCTAssertEqual ( cookie. domain, " . swift.org" )
192
240
XCTAssertEqual ( cookie. path, " / " )
193
241
}
194
242
}
@@ -201,4 +249,11 @@ class TestHTTPCookie: XCTestCase {
201
249
XCTFail ( " Unable to create cookie with substring " )
202
250
}
203
251
}
252
+
253
+ private func formattedCookieTime( sinceNow seconds: TimeInterval ) -> String {
254
+ let f = DateFormatter ( )
255
+ f. timeZone = TimeZone ( abbreviation: " GMT " )
256
+ f. dateFormat = " EEEE',' dd'-'MMM'-'yy HH':'mm':'ss z "
257
+ return f. string ( from: Date ( timeIntervalSinceNow: seconds) )
258
+ }
204
259
}
0 commit comments