Skip to content

Commit

Permalink
CookieJar - return 'best-match' and not LIFO (#7577)
Browse files Browse the repository at this point in the history
Co-authored-by: marq24 <marq24@emac.de>
(cherry picked from commit 9c932f7)
  • Loading branch information
marq24 authored and Dreamsorcerer committed Sep 7, 2023
1 parent 8c4ec62 commit 675eab9
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGES/7577.bugfix
@@ -0,0 +1 @@
Fix sorting in filter_cookies to use cookie with longest path -- by :user:`marq24`.
1 change: 1 addition & 0 deletions CONTRIBUTORS.txt
Expand Up @@ -211,6 +211,7 @@ Martin Melka
Martin Richard
Mathias Fröjdman
Mathieu Dugré
Matthias Marquardt
Matthieu Hauglustaine
Matthieu Rigal
Meet Mangukiya
Expand Down
3 changes: 2 additions & 1 deletion aiohttp/cookiejar.py
Expand Up @@ -251,7 +251,8 @@ def filter_cookies(
and request_origin not in self._treat_as_secure_origin
)

for cookie in self:
# Point 2: https://www.rfc-editor.org/rfc/rfc6265.html#section-5.4
for cookie in sorted(self, key=lambda c: len(c["path"])):
name = cookie.key
domain = cookie["domain"]

Expand Down
30 changes: 30 additions & 0 deletions tests/test_cookiejar.py
Expand Up @@ -686,6 +686,36 @@ async def make_jar():
self.assertEqual(len(jar_filtered), 1)
self.assertEqual(jar_filtered["path-cookie"].value, "one")

def test_path_filter_diff_folder_same_name_return_best_match_independent_from_put_order(
self,
) -> None:
async def make_jar():
return CookieJar(unsafe=True)

jar = self.loop.run_until_complete(make_jar())
jar.update_cookies(
SimpleCookie("path-cookie=one; Domain=pathtest.com; Path=/one; ")
)
jar.update_cookies(
SimpleCookie("path-cookie=zero; Domain=pathtest.com; Path=/; ")
)
jar.update_cookies(
SimpleCookie("path-cookie=two; Domain=pathtest.com; Path=/second; ")
)
self.assertEqual(len(jar), 3)

jar_filtered = jar.filter_cookies(URL("http://pathtest.com/"))
self.assertEqual(len(jar_filtered), 1)
self.assertEqual(jar_filtered["path-cookie"].value, "zero")

jar_filtered = jar.filter_cookies(URL("http://pathtest.com/second"))
self.assertEqual(len(jar_filtered), 1)
self.assertEqual(jar_filtered["path-cookie"].value, "two")

jar_filtered = jar.filter_cookies(URL("http://pathtest.com/one"))
self.assertEqual(len(jar_filtered), 1)
self.assertEqual(jar_filtered["path-cookie"].value, "one")


async def test_dummy_cookie_jar() -> None:
cookie = SimpleCookie("foo=bar; Domain=example.com;")
Expand Down

0 comments on commit 675eab9

Please sign in to comment.