diff --git a/Lib/_LWPCookieJar.py b/Lib/_LWPCookieJar.py index 2c8d4564e0b..25a25286ab1 100644 --- a/Lib/_LWPCookieJar.py +++ b/Lib/_LWPCookieJar.py @@ -115,13 +115,6 @@ class LWPCookieJar(FileCookieJar): for data in split_header_words([line]): name, value = data[0] - # name and value are an exception here, since a plain "foo" - # (with no "=", unlike "bar=foo") means a cookie with no - # name and value "foo". With all other cookie-attributes, - # the situation is reversed: "foo" means an attribute named - # "foo" with no value! - if value is None: - name, value = value, name standard = {} rest = {} for k in boolean_attrs: diff --git a/Lib/_MozillaCookieJar.py b/Lib/_MozillaCookieJar.py index 0e08c09d6cb..88e8492504b 100644 --- a/Lib/_MozillaCookieJar.py +++ b/Lib/_MozillaCookieJar.py @@ -73,6 +73,9 @@ class MozillaCookieJar(FileCookieJar): secure = (secure == "TRUE") domain_specified = (domain_specified == "TRUE") if name == "": + # cookies.txt regards 'Set-Cookie: foo' as a cookie + # with no name, whereas cookielib regards it as a + # cookie with no value. name = value value = None diff --git a/Lib/cookielib.py b/Lib/cookielib.py index 49989b436e9..42a2513fec8 100644 --- a/Lib/cookielib.py +++ b/Lib/cookielib.py @@ -451,11 +451,7 @@ def parse_ns_headers(ns_headers): param = param.rstrip() if param == "": continue if "=" not in param: - if param.lower() in known_attrs: - k, v = param, None - else: - # cookie with missing value - k, v = param, None + k, v = param, None else: k, v = re.split(r"\s*=\s*", param, 1) k = k.lstrip() diff --git a/Lib/test/test_cookielib.py b/Lib/test/test_cookielib.py index 679e3aa8166..78283262506 100644 --- a/Lib/test/test_cookielib.py +++ b/Lib/test/test_cookielib.py @@ -231,6 +231,24 @@ def _interact(cookiejar, url, set_cookie_hdrs, hdr_name): return cookie_hdr +class FileCookieJarTests(TestCase): + def test_lwp_valueless_cookie(self): + # cookies with no value should be saved and loaded consistently + from cookielib import LWPCookieJar + filename = test_support.TESTFN + c = LWPCookieJar() + interact_netscape(c, "http://www.acme.com/", 'boo') + self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) + try: + c.save(filename, ignore_discard=True) + c = LWPCookieJar() + c.load(filename, ignore_discard=True) + finally: + try: os.unlink(filename) + except OSError: pass + self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) + + class CookieTests(TestCase): # XXX # Get rid of string comparisons where not actually testing str / repr. @@ -1636,6 +1654,7 @@ def test_main(verbose=None): DateTimeTests, HeaderTests, CookieTests, + FileCookieJarTests, LWPCookieTests, ) diff --git a/Misc/NEWS b/Misc/NEWS index df044f41390..cdb9f8004b7 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -61,6 +61,9 @@ Extension Modules Library ------- +- Patch #1117454: Remove code to special-case cookies without values + in LWPCookieJar. + - Patch #1117339: Add cookielib special name tests. - Patch #1112812: Make bsddb/__init__.py more friendly for modulefinder.