Skip to content

Commit 4cf74bc

Browse files
Fix behaviour with multiple Set-Cookie headers (#1156)
1 parent b9db5e1 commit 4cf74bc

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

httpx/_models.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,9 @@ def __init__(self, response: Response):
11961196

11971197
def info(self) -> email.message.Message:
11981198
info = email.message.Message()
1199-
for key, value in self.response.headers.items():
1199+
for key, value in self.response.headers.multi_items():
1200+
#  Note that setting `info[key]` here is an "append" operation,
1201+
# not a "replace" operation.
1202+
# https://docs.python.org/3/library/email.compat32-message.html#email.message.Message.__setitem__
12001203
info[key] = value
12011204
return info

tests/models/test_cookies.py

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import http
2+
13
import pytest
24

3-
from httpx import CookieConflict, Cookies
5+
import httpx
46

57

68
def test_cookies():
7-
cookies = Cookies({"name": "value"})
9+
cookies = httpx.Cookies({"name": "value"})
810
assert cookies["name"] == "value"
911
assert "name" in cookies
1012
assert len(cookies) == 1
@@ -19,8 +21,8 @@ def test_cookies():
1921

2022

2123
def test_cookies_update():
22-
cookies = Cookies()
23-
more_cookies = Cookies()
24+
cookies = httpx.Cookies()
25+
more_cookies = httpx.Cookies()
2426
more_cookies.set("name", "value", domain="example.com")
2527

2628
cookies.update(more_cookies)
@@ -29,22 +31,47 @@ def test_cookies_update():
2931

3032

3133
def test_cookies_with_domain():
32-
cookies = Cookies()
34+
cookies = httpx.Cookies()
3335
cookies.set("name", "value", domain="example.com")
3436
cookies.set("name", "value", domain="example.org")
3537

36-
with pytest.raises(CookieConflict):
38+
with pytest.raises(httpx.CookieConflict):
3739
cookies["name"]
3840

3941
cookies.clear(domain="example.com")
4042
assert len(cookies) == 1
4143

4244

4345
def test_cookies_with_domain_and_path():
44-
cookies = Cookies()
46+
cookies = httpx.Cookies()
4547
cookies.set("name", "value", domain="example.com", path="/subpath/1")
4648
cookies.set("name", "value", domain="example.com", path="/subpath/2")
4749
cookies.clear(domain="example.com", path="/subpath/1")
4850
assert len(cookies) == 1
4951
cookies.delete("name", domain="example.com", path="/subpath/2")
5052
assert len(cookies) == 0
53+
54+
55+
def test_multiple_set_cookie():
56+
jar = http.cookiejar.CookieJar()
57+
headers = [
58+
(
59+
b"Set-Cookie",
60+
b"1P_JAR=2020-08-09-18; expires=Tue, 08-Sep-2020 18:33:35 GMT; "
61+
b"path=/; domain=.example.org; Secure",
62+
),
63+
(
64+
b"Set-Cookie",
65+
b"NID=204=KWdXOuypc86YvRfBSiWoW1dEXfSl_5qI7sxZY4umlk4J35yNTeNEkw15"
66+
b"MRaujK6uYCwkrtjihTTXZPp285z_xDOUzrdHt4dj0Z5C0VOpbvdLwRdHatHAzQs7"
67+
b"7TsaiWY78a3qU9r7KP_RbSLvLl2hlhnWFR2Hp5nWKPsAcOhQgSg; expires=Mon, "
68+
b"08-Feb-2021 18:33:35 GMT; path=/; domain=.example.org; HttpOnly",
69+
),
70+
]
71+
request = httpx.Request("GET", "https://www.example.org")
72+
response = httpx.Response(200, request=request, headers=headers)
73+
74+
cookies = httpx.Cookies(jar)
75+
cookies.extract_cookies(response)
76+
77+
assert len(cookies) == 2

0 commit comments

Comments
 (0)