Skip to content

Commit 2bf3127

Browse files
committed
bpo-30681: Change error handling to return None in case of invalid date
1 parent 3358d58 commit 2bf3127

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

Lib/email/utils.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,19 @@ def make_msgid(idstring=None, domain=None):
207207

208208

209209
def parsedate_to_datetime(data):
210-
*dtuple, tz = _parsedate_tz(data)
211-
if tz is None:
212-
return datetime.datetime(*dtuple[:6])
213-
return datetime.datetime(*dtuple[:6],
214-
tzinfo=datetime.timezone(datetime.timedelta(seconds=tz)))
210+
try:
211+
*dtuple, tz = _parsedate_tz(data)
212+
except TypeError:
213+
# _parsedate_tz(data) returned None due to failure to parse
214+
return None
215+
try:
216+
if tz is None:
217+
return datetime.datetime(*dtuple[:6])
218+
return datetime.datetime(*dtuple[:6],
219+
tzinfo=datetime.timezone(datetime.timedelta(seconds=tz)))
220+
except ValueError:
221+
# Date parsed ok, but one or more component values are invalid
222+
return None
215223

216224

217225
def parseaddr(addr):

Lib/test/test_email/test_utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ def test_parsedate_to_datetime_naive(self):
4848
utils.parsedate_to_datetime(self.datestring + ' -0000'),
4949
self.naive_dt)
5050

51+
def test_parsedate_to_datetime_invalid_string(self):
52+
self.assertIsNone(
53+
utils.parsedate_to_datetime('')
54+
)
55+
56+
def test_parsedate_to_datetime_invalid_date(self):
57+
self.assertIsNone(
58+
utils.parsedate_to_datetime('Tue, 06 Jun 2017 27:39:33 +0600')
59+
)
60+
5161

5262
class LocaltimeTests(unittest.TestCase):
5363

0 commit comments

Comments
 (0)