Commit 3e7de59b authored by Neal Norwitz's avatar Neal Norwitz

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.
parent b164dafe
...@@ -12,8 +12,8 @@ libwww-perl, I hope. ...@@ -12,8 +12,8 @@ libwww-perl, I hope.
""" """
import time, re, logging import time, re, logging
from cookielib import (reraise_unmasked_exceptions, FileCookieJar, Cookie, from cookielib import (reraise_unmasked_exceptions, FileCookieJar, LoadError,
MISSING_FILENAME_TEXT, join_header_words, split_header_words, Cookie, MISSING_FILENAME_TEXT, join_header_words, split_header_words,
iso2time, time2isoz) iso2time, time2isoz)
def lwp_cookie_str(cookie): def lwp_cookie_str(cookie):
...@@ -93,7 +93,7 @@ class LWPCookieJar(FileCookieJar): ...@@ -93,7 +93,7 @@ class LWPCookieJar(FileCookieJar):
magic = f.readline() magic = f.readline()
if not re.search(self.magic_re, magic): if not re.search(self.magic_re, magic):
msg = "%s does not seem to contain cookies" % filename msg = "%s does not seem to contain cookies" % filename
raise IOError(msg) raise LoadError(msg)
now = time.time() now = time.time()
...@@ -161,4 +161,4 @@ class LWPCookieJar(FileCookieJar): ...@@ -161,4 +161,4 @@ class LWPCookieJar(FileCookieJar):
self.set_cookie(c) self.set_cookie(c)
except: except:
reraise_unmasked_exceptions((IOError,)) reraise_unmasked_exceptions((IOError,))
raise IOError("invalid Set-Cookie3 format file %s" % filename) raise LoadError("invalid Set-Cookie3 format file %s" % filename)
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
import re, time, logging import re, time, logging
from cookielib import (reraise_unmasked_exceptions, FileCookieJar, Cookie, from cookielib import (reraise_unmasked_exceptions, FileCookieJar, LoadError,
MISSING_FILENAME_TEXT) Cookie, MISSING_FILENAME_TEXT)
class MozillaCookieJar(FileCookieJar): class MozillaCookieJar(FileCookieJar):
""" """
...@@ -50,7 +50,7 @@ class MozillaCookieJar(FileCookieJar): ...@@ -50,7 +50,7 @@ class MozillaCookieJar(FileCookieJar):
magic = f.readline() magic = f.readline()
if not re.search(self.magic_re, magic): if not re.search(self.magic_re, magic):
f.close() f.close()
raise IOError( raise LoadError(
"%s does not look like a Netscape format cookies file" % "%s does not look like a Netscape format cookies file" %
filename) filename)
...@@ -106,8 +106,8 @@ class MozillaCookieJar(FileCookieJar): ...@@ -106,8 +106,8 @@ class MozillaCookieJar(FileCookieJar):
except: except:
reraise_unmasked_exceptions((IOError,)) reraise_unmasked_exceptions((IOError,))
raise IOError("invalid Netscape format file %s: %s" % raise LoadError("invalid Netscape format file %s: %s" %
(filename, line)) (filename, line))
def save(self, filename=None, ignore_discard=False, ignore_expires=False): def save(self, filename=None, ignore_discard=False, ignore_expires=False):
if filename is None: if filename is None:
......
...@@ -1682,7 +1682,8 @@ class CookieJar: ...@@ -1682,7 +1682,8 @@ class CookieJar:
return "<%s[%s]>" % (self.__class__, ", ".join(r)) 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): class FileCookieJar(CookieJar):
"""CookieJar that can be loaded from and saved to a file.""" """CookieJar that can be loaded from and saved to a file."""
......
...@@ -248,6 +248,31 @@ class FileCookieJarTests(TestCase): ...@@ -248,6 +248,31 @@ class FileCookieJarTests(TestCase):
except OSError: pass except OSError: pass
self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) 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): class CookieTests(TestCase):
# XXX # XXX
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment