From 47214e46d852e9d7ddf81d69a8e70806e2396c6c Mon Sep 17 00:00:00 2001 From: dirkf Date: Mon, 17 Jul 2023 20:39:11 +0100 Subject: [PATCH] [compat] Fix old Pythons broken loading of valueless cookie attributes Cookie string parsing in Py 2.6.9, probably earlier, requires `=`. Also 3.2, though the CPython code appears to be OK: 3.1 was also wrong. --- youtube_dl/compat.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/youtube_dl/compat.py b/youtube_dl/compat.py index cd11ba5aa..1d784d90f 100644 --- a/youtube_dl/compat.py +++ b/youtube_dl/compat.py @@ -126,12 +126,24 @@ except ImportError: # Python 2 import Cookie as compat_cookies compat_http_cookies = compat_cookies -if sys.version_info[0] == 2: +if sys.version_info[0] == 2 or sys.version_info < (3, 3): class compat_cookies_SimpleCookie(compat_cookies.SimpleCookie): def load(self, rawdata): - if isinstance(rawdata, compat_str): - rawdata = str(rawdata) - return super(compat_cookies_SimpleCookie, self).load(rawdata) + must_have_value = 0 + if not isinstance(rawdata, dict): + if sys.version_info[:2] != (2, 7): + # attribute must have value for parsing + rawdata, must_have_value = re.subn( + r'(?i)(;\s*)(secure|httponly)(\s*(?:;|$))', r'\1\2=\2\3', rawdata) + if sys.version_info[0] == 2: + if isinstance(rawdata, compat_str): + rawdata = str(rawdata) + super(compat_cookies_SimpleCookie, self).load(rawdata) + if must_have_value > 0: + for morsel in self.values(): + for attr in ('secure', 'httponly'): + if morsel.get(attr): + morsel[attr] = True else: compat_cookies_SimpleCookie = compat_cookies.SimpleCookie compat_http_cookies_SimpleCookie = compat_cookies_SimpleCookie