summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2012-09-22 09:59:51 -0400
committerR David Murray <rdmurray@bitdance.com>2012-09-22 09:59:51 -0400
commit752a2241eab92d223b4f803c1cd20494bf17e799 (patch)
treeab634a875096566015e962674516341bbecde440
parentfb436c4ebaff171cfff789e702dbc6b5a00281cf (diff)
downloadcpython-git-752a2241eab92d223b4f803c1cd20494bf17e799.tar.gz
#15925: fix regression: return None for null and non-date strings.
Since the logic for null detection had to move into the _parseaddr functions, I removed the wrappers from email.utils and just import the _parseaddr functions directly.
-rw-r--r--Lib/email/_parseaddr.py4
-rw-r--r--Lib/email/utils.py24
-rw-r--r--Lib/test/test_email/test_email.py13
-rw-r--r--Misc/NEWS3
4 files changed, 20 insertions, 24 deletions
diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py
index 3528d0297c..cdfa3729ad 100644
--- a/Lib/email/_parseaddr.py
+++ b/Lib/email/_parseaddr.py
@@ -48,6 +48,8 @@ def parsedate_tz(data):
Accounts for military timezones.
"""
res = _parsedate_tz(data)
+ if not res:
+ return
if res[9] is None:
res[9] = 0
return tuple(res)
@@ -62,6 +64,8 @@ def _parsedate_tz(data):
source timezone really was UTC.
"""
+ if not data:
+ return
data = data.split()
# The FWS after the comma after the day-of-week is optional, so search and
# adjust for this.
diff --git a/Lib/email/utils.py b/Lib/email/utils.py
index 73bc3481d6..6b6d7f4474 100644
--- a/Lib/email/utils.py
+++ b/Lib/email/utils.py
@@ -37,10 +37,7 @@ from email._parseaddr import quote
from email._parseaddr import AddressList as _AddressList
from email._parseaddr import mktime_tz
-# We need wormarounds for bugs in these methods in older Pythons (see below)
-from email._parseaddr import parsedate as _parsedate
-from email._parseaddr import parsedate_tz as _parsedate_tz
-from email._parseaddr import _parsedate_tz as __parsedate_tz
+from email._parseaddr import parsedate, parsedate_tz, _parsedate_tz
from quopri import decodestring as _qdecode
@@ -222,25 +219,8 @@ def make_msgid(idstring=None, domain=None):
return msgid
-
-# These functions are in the standalone mimelib version only because they've
-# subsequently been fixed in the latest Python versions. We use this to worm
-# around broken older Pythons.
-def parsedate(data):
- if not data:
- return None
- return _parsedate(data)
-
-
-def parsedate_tz(data):
- if not data:
- return None
- return _parsedate_tz(data)
-
def parsedate_to_datetime(data):
- if not data:
- return None
- *dtuple, tz = __parsedate_tz(data)
+ *dtuple, tz = _parsedate_tz(data)
if tz is None:
return datetime.datetime(*dtuple[:6])
return datetime.datetime(*dtuple[:6],
diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
index 5cc6d0467e..36c344f846 100644
--- a/Lib/test/test_email/test_email.py
+++ b/Lib/test/test_email/test_email.py
@@ -2718,8 +2718,17 @@ class TestMiscellaneous(TestEmailBase):
utils.formatdate(now, localtime=False, usegmt=True),
time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(now)))
- def test_parsedate_none(self):
- self.assertEqual(utils.parsedate(''), None)
+ # parsedate and parsedate_tz will become deprecated interfaces someday
+ def test_parsedate_returns_None_for_invalid_strings(self):
+ self.assertIsNone(utils.parsedate(''))
+ self.assertIsNone(utils.parsedate_tz(''))
+ self.assertIsNone(utils.parsedate('0'))
+ self.assertIsNone(utils.parsedate_tz('0'))
+ self.assertIsNone(utils.parsedate('A Complete Waste of Time'))
+ self.assertIsNone(utils.parsedate_tz('A Complete Waste of Time'))
+ # Not a part of the spec but, but this has historically worked:
+ self.assertIsNone(utils.parsedate(None))
+ self.assertIsNone(utils.parsedate_tz(None))
def test_parsedate_compact(self):
# The FWS after the comma is optional
diff --git a/Misc/NEWS b/Misc/NEWS
index abe8eb8028..ac449101f1 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -36,6 +36,9 @@ Core and Builtins
Library
-------
+- Issue #15925: fixed regression in email.utils.parsedate and parsedate_tz
+ handling of empty and non-date strings.
+
- Issue #15421: fix an OverflowError in Calendar.itermonthdates() after
datetime.MAXYEAR. Patch by Cédric Krier.