From 3e7de59bd2ac22f677f3a053ade22f44785f15f4 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Fri, 23 Dec 2005 21:24:35 +0000 Subject: [PATCH] Fix SF #1117398, cookielib LWPCookieJar and MozillaCookieJar exceptions cookielib.LWPCookieJar and .MozillaCookieJar are documented to raise cookielib.LoadError on attempt to load an invalid cookies file, but raise IOError instead. Compromise by having LoadError subclass IOError. --- Lib/_LWPCookieJar.py | 8 ++++---- Lib/_MozillaCookieJar.py | 10 +++++----- Lib/cookielib.py | 3 ++- Lib/test/test_cookielib.py | 25 +++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/Lib/_LWPCookieJar.py b/Lib/_LWPCookieJar.py index 25a25286ab..6d5ce185e5 100644 --- a/Lib/_LWPCookieJar.py +++ b/Lib/_LWPCookieJar.py @@ -12,8 +12,8 @@ libwww-perl, I hope. """ import time, re, logging -from cookielib import (reraise_unmasked_exceptions, FileCookieJar, Cookie, - MISSING_FILENAME_TEXT, join_header_words, split_header_words, +from cookielib import (reraise_unmasked_exceptions, FileCookieJar, LoadError, + Cookie, MISSING_FILENAME_TEXT, join_header_words, split_header_words, iso2time, time2isoz) def lwp_cookie_str(cookie): @@ -93,7 +93,7 @@ class LWPCookieJar(FileCookieJar): magic = f.readline() if not re.search(self.magic_re, magic): msg = "%s does not seem to contain cookies" % filename - raise IOError(msg) + raise LoadError(msg) now = time.time() @@ -161,4 +161,4 @@ class LWPCookieJar(FileCookieJar): self.set_cookie(c) except: reraise_unmasked_exceptions((IOError,)) - raise IOError("invalid Set-Cookie3 format file %s" % filename) + raise LoadError("invalid Set-Cookie3 format file %s" % filename) diff --git a/Lib/_MozillaCookieJar.py b/Lib/_MozillaCookieJar.py index 88e8492504..4f2f3754d8 100644 --- a/Lib/_MozillaCookieJar.py +++ b/Lib/_MozillaCookieJar.py @@ -2,8 +2,8 @@ import re, time, logging -from cookielib import (reraise_unmasked_exceptions, FileCookieJar, Cookie, - MISSING_FILENAME_TEXT) +from cookielib import (reraise_unmasked_exceptions, FileCookieJar, LoadError, + Cookie, MISSING_FILENAME_TEXT) class MozillaCookieJar(FileCookieJar): """ @@ -50,7 +50,7 @@ class MozillaCookieJar(FileCookieJar): magic = f.readline() if not re.search(self.magic_re, magic): f.close() - raise IOError( + raise LoadError( "%s does not look like a Netscape format cookies file" % filename) @@ -106,8 +106,8 @@ class MozillaCookieJar(FileCookieJar): except: reraise_unmasked_exceptions((IOError,)) - raise IOError("invalid Netscape format file %s: %s" % - (filename, line)) + raise LoadError("invalid Netscape format file %s: %s" % + (filename, line)) def save(self, filename=None, ignore_discard=False, ignore_expires=False): if filename is None: diff --git a/Lib/cookielib.py b/Lib/cookielib.py index f774cdfa5b..656ae398fd 100644 --- a/Lib/cookielib.py +++ b/Lib/cookielib.py @@ -1682,7 +1682,8 @@ class CookieJar: return "<%s[%s]>" % (self.__class__, ", ".join(r)) -class LoadError(Exception): pass +# derives from IOError for backwards-compatibility with Python 2.4.0 +class LoadError(IOError): pass class FileCookieJar(CookieJar): """CookieJar that can be loaded from and saved to a file.""" diff --git a/Lib/test/test_cookielib.py b/Lib/test/test_cookielib.py index 7828326250..f0c66837ce 100644 --- a/Lib/test/test_cookielib.py +++ b/Lib/test/test_cookielib.py @@ -248,6 +248,31 @@ class FileCookieJarTests(TestCase): except OSError: pass self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) + def test_bad_magic(self): + from cookielib import LWPCookieJar, MozillaCookieJar, LoadError + # IOErrors (eg. file doesn't exist) are allowed to propagate + filename = test_support.TESTFN + for cookiejar_class in LWPCookieJar, MozillaCookieJar: + c = cookiejar_class() + try: + c.load(filename="for this test to work, a file with this " + "filename should not exist") + except IOError, exc: + # exactly IOError, not LoadError + self.assertEqual(exc.__class__, IOError) + else: + self.fail("expected IOError for invalid filename") + # Invalid contents of cookies file (eg. bad magic string) + # causes a LoadError. + try: + f = open(filename, "w") + f.write("oops\n") + for cookiejar_class in LWPCookieJar, MozillaCookieJar: + c = cookiejar_class() + self.assertRaises(LoadError, c.load, filename) + finally: + try: os.unlink(filename) + except OSError: pass class CookieTests(TestCase): # XXX -- 2.40.0