Skip to content

Commit 0fbfdcc

Browse files
authored
fix malformed cookie parsing (#210)
1 parent 75a0433 commit 0fbfdcc

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

Sources/AsyncHTTPClient/HTTPClient+HTTPCookie.swift

+10-2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ extension HTTPClient {
6161
self.name = nameAndValue[0]
6262
self.value = nameAndValue[1]
6363

64+
guard !self.name.isEmpty else {
65+
return nil
66+
}
67+
6468
self.path = "/"
6569
self.domain = defaultDomain
6670
self.expires = nil
@@ -70,6 +74,8 @@ extension HTTPClient {
7074

7175
for component in components[1...] {
7276
switch self.parseComponent(component) {
77+
case (nil, nil):
78+
continue
7379
case ("path", .some(let value)):
7480
self.path = value
7581
case ("domain", .some(let value)):
@@ -114,14 +120,16 @@ extension HTTPClient {
114120
self.secure = secure
115121
}
116122

117-
func parseComponent(_ component: String) -> (String, String?) {
123+
func parseComponent(_ component: String) -> (String?, String?) {
118124
let nameAndValue = component.split(separator: "=", maxSplits: 1).map {
119125
$0.trimmingCharacters(in: .whitespaces)
120126
}
121127
if nameAndValue.count == 2 {
122128
return (nameAndValue[0].lowercased(), nameAndValue[1])
129+
} else if nameAndValue.count == 1 {
130+
return (nameAndValue[0].lowercased(), nil)
123131
}
124-
return (nameAndValue[0].lowercased(), nil)
132+
return (nil, nil)
125133
}
126134
}
127135
}

Tests/AsyncHTTPClientTests/HTTPClientCookieTests+XCTest.swift

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ extension HTTPClientCookieTests {
2929
("testEmptyValueCookie", testEmptyValueCookie),
3030
("testCookieDefaults", testCookieDefaults),
3131
("testCookieInit", testCookieInit),
32+
("testMalformedCookies", testMalformedCookies),
3233
]
3334
}
3435
}

Tests/AsyncHTTPClientTests/HTTPClientCookieTests.swift

+15
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,19 @@ class HTTPClientCookieTests: XCTestCase {
6767
XCTAssertTrue(c.httpOnly)
6868
XCTAssertTrue(c.secure)
6969
}
70+
71+
func testMalformedCookies() {
72+
XCTAssertNil(HTTPClient.Cookie(header: "", defaultDomain: "exampe.org"))
73+
XCTAssertNil(HTTPClient.Cookie(header: ";;", defaultDomain: "exampe.org"))
74+
XCTAssertNil(HTTPClient.Cookie(header: "name;;", defaultDomain: "exampe.org"))
75+
XCTAssertNotNil(HTTPClient.Cookie(header: "name=;;", defaultDomain: "exampe.org"))
76+
XCTAssertNotNil(HTTPClient.Cookie(header: "name=value;;", defaultDomain: "exampe.org"))
77+
XCTAssertNotNil(HTTPClient.Cookie(header: "name=value;x;", defaultDomain: "exampe.org"))
78+
XCTAssertNotNil(HTTPClient.Cookie(header: "name=value;x=;", defaultDomain: "exampe.org"))
79+
XCTAssertNotNil(HTTPClient.Cookie(header: "name=value;;x=;", defaultDomain: "exampe.org"))
80+
XCTAssertNil(HTTPClient.Cookie(header: ";key=value", defaultDomain: "exampe.org"))
81+
XCTAssertNil(HTTPClient.Cookie(header: "key;key=value", defaultDomain: "exampe.org"))
82+
XCTAssertNil(HTTPClient.Cookie(header: "=;", defaultDomain: "exampe.org"))
83+
XCTAssertNil(HTTPClient.Cookie(header: "=value;", defaultDomain: "exampe.org"))
84+
}
7085
}

0 commit comments

Comments
 (0)