Commit 752a2241 authored by R David Murray's avatar R David Murray

#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.
parent fb436c4e
...@@ -48,6 +48,8 @@ def parsedate_tz(data): ...@@ -48,6 +48,8 @@ def parsedate_tz(data):
Accounts for military timezones. Accounts for military timezones.
""" """
res = _parsedate_tz(data) res = _parsedate_tz(data)
if not res:
return
if res[9] is None: if res[9] is None:
res[9] = 0 res[9] = 0
return tuple(res) return tuple(res)
...@@ -62,6 +64,8 @@ def _parsedate_tz(data): ...@@ -62,6 +64,8 @@ def _parsedate_tz(data):
source timezone really was UTC. source timezone really was UTC.
""" """
if not data:
return
data = data.split() data = data.split()
# The FWS after the comma after the day-of-week is optional, so search and # The FWS after the comma after the day-of-week is optional, so search and
# adjust for this. # adjust for this.
......
...@@ -37,10 +37,7 @@ from email._parseaddr import quote ...@@ -37,10 +37,7 @@ from email._parseaddr import quote
from email._parseaddr import AddressList as _AddressList from email._parseaddr import AddressList as _AddressList
from email._parseaddr import mktime_tz from email._parseaddr import mktime_tz
# We need wormarounds for bugs in these methods in older Pythons (see below) from email._parseaddr import parsedate, parsedate_tz, _parsedate_tz
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 quopri import decodestring as _qdecode from quopri import decodestring as _qdecode
...@@ -222,25 +219,8 @@ def make_msgid(idstring=None, domain=None): ...@@ -222,25 +219,8 @@ def make_msgid(idstring=None, domain=None):
return msgid 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): def parsedate_to_datetime(data):
if not data: *dtuple, tz = _parsedate_tz(data)
return None
*dtuple, tz = __parsedate_tz(data)
if tz is None: if tz is None:
return datetime.datetime(*dtuple[:6]) return datetime.datetime(*dtuple[:6])
return datetime.datetime(*dtuple[:6], return datetime.datetime(*dtuple[:6],
......
...@@ -2718,8 +2718,17 @@ class TestMiscellaneous(TestEmailBase): ...@@ -2718,8 +2718,17 @@ class TestMiscellaneous(TestEmailBase):
utils.formatdate(now, localtime=False, usegmt=True), utils.formatdate(now, localtime=False, usegmt=True),
time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(now))) time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime(now)))
def test_parsedate_none(self): # parsedate and parsedate_tz will become deprecated interfaces someday
self.assertEqual(utils.parsedate(''), None) 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): def test_parsedate_compact(self):
# The FWS after the comma is optional # The FWS after the comma is optional
......
...@@ -36,6 +36,9 @@ Core and Builtins ...@@ -36,6 +36,9 @@ Core and Builtins
Library 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 - Issue #15421: fix an OverflowError in Calendar.itermonthdates() after
datetime.MAXYEAR. Patch by Cédric Krier. datetime.MAXYEAR. Patch by Cédric Krier.
......
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