Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions Lib/email/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -317,10 +317,13 @@ def parsedate_to_datetime(data):
if parsed_date_tz is None:
raise ValueError('Invalid date value or format "%s"' % str(data))
*dtuple, tz = parsed_date_tz
if tz is None:
return datetime.datetime(*dtuple[:6])
return datetime.datetime(*dtuple[:6],
tzinfo=datetime.timezone(datetime.timedelta(seconds=tz)))
try:
if tz is None:
return datetime.datetime(*dtuple[:6])
return datetime.datetime(*dtuple[:6],
tzinfo=datetime.timezone(datetime.timedelta(seconds=tz)))
except OverflowError as exc:
raise ValueError('Invalid date value or format "%s"' % str(data)) from exc


def parseaddr(addr, *, strict=True):
Expand Down
8 changes: 8 additions & 0 deletions Lib/test/test_email/test_headerregistry.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,14 @@ def test_invalid_date_value(self):
self.assertEqual(len(h.defects), 1)
self.assertIsInstance(h.defects[0], errors.InvalidDateDefect)

def test_out_of_range_date_value(self):
s = 'Mon, 20 Nov 9999999999 12:00:00 +0000'
h = self.make_header('date', s)
self.assertEqual(h, s)
self.assertIsNone(h.datetime)
self.assertEqual(len(h.defects), 1)
self.assertIsInstance(h.defects[0], errors.InvalidDateDefect)

def test_datetime_read_only(self):
h = self.make_header('date', self.datestring)
with self.assertRaises(AttributeError):
Expand Down
9 changes: 9 additions & 0 deletions Lib/test/test_email/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,15 @@ def test_parsedate_to_datetime_with_invalid_raises_valueerror(self):
with self.subTest(dtstr=dtstr):
self.assertRaises(ValueError, utils.parsedate_to_datetime, dtstr)

def test_parsedate_to_datetime_out_of_range_raises_valueerror(self):
out_of_range_dates = [
'Mon, 20 Nov 9999999999 12:00:00 +0000',
'Mon, 20 Nov 2017 12:00:00 +24000000000000',
]
for dtstr in out_of_range_dates:
with self.subTest(dtstr=dtstr):
self.assertRaises(ValueError, utils.parsedate_to_datetime, dtstr)

class LocaltimeTests(unittest.TestCase):

def test_localtime_is_tz_aware_daylight_true(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
:func:`email.utils.parsedate_to_datetime` now raises :exc:`ValueError`
instead of :exc:`OverflowError` when the parsed year or timezone offset is
out of range, matching its documented behavior.
Loading