Commit 219d1c8a authored by R. David Murray's avatar R. David Murray

#1194222: make parsedate always return RFC2822 four character years.

Two character years are now converted to four character years using
the Posix standard rule (<68 == 2000, >=68==1900).  This makes the
parsed date RFC2822 compliant even if the input is not.

Patch and test by Jeffrey Finkelstein.
parent 1970b62a
...@@ -107,6 +107,18 @@ def parsedate_tz(data): ...@@ -107,6 +107,18 @@ def parsedate_tz(data):
tss = int(tss) tss = int(tss)
except ValueError: except ValueError:
return None return None
# Check for a yy specified in two-digit format, then convert it to the
# appropriate four-digit format, according to the POSIX standard. RFC 822
# calls for a two-digit yy, but RFC 2822 (which obsoletes RFC 822)
# mandates a 4-digit yy. For more information, see the documentation for
# the time module.
if yy < 100:
# The year is between 1969 and 1999 (inclusive).
if yy > 68:
yy += 1900
# The year is between 2000 and 2068 (inclusive).
else:
yy += 2000
tzoffset = None tzoffset = None
tz = tz.upper() tz = tz.upper()
if tz in _timezones: if tz in _timezones:
......
...@@ -2234,6 +2234,19 @@ class TestMiscellaneous(TestEmailBase): ...@@ -2234,6 +2234,19 @@ class TestMiscellaneous(TestEmailBase):
eq(time.localtime(t)[:6], timetup[:6]) eq(time.localtime(t)[:6], timetup[:6])
eq(int(time.strftime('%Y', timetup[:9])), 2003) eq(int(time.strftime('%Y', timetup[:9])), 2003)
def test_parsedate_y2k(self):
"""Test for parsing a date with a two-digit year.
Parsing a date with a two-digit year should return the correct
four-digit year. RFC822 allows two-digit years, but RFC2822 (which
obsoletes RFC822) requires four-digit years.
"""
self.assertEqual(utils.parsedate_tz('25 Feb 03 13:47:26 -0800'),
utils.parsedate_tz('25 Feb 2003 13:47:26 -0800'))
self.assertEqual(utils.parsedate_tz('25 Feb 71 13:47:26 -0800'),
utils.parsedate_tz('25 Feb 1971 13:47:26 -0800'))
def test_parseaddr_empty(self): def test_parseaddr_empty(self):
self.assertEqual(utils.parseaddr('<>'), ('', '')) self.assertEqual(utils.parseaddr('<>'), ('', ''))
self.assertEqual(utils.formataddr(utils.parseaddr('<>')), '') self.assertEqual(utils.formataddr(utils.parseaddr('<>')), '')
......
...@@ -260,6 +260,7 @@ Niels Ferguson ...@@ -260,6 +260,7 @@ Niels Ferguson
Sebastian Fernandez Sebastian Fernandez
Vincent Fiack Vincent Fiack
Tomer Filiba Tomer Filiba
Jeffrey Finkelstein
Russell Finn Russell Finn
Nils Fischbeck Nils Fischbeck
Frederik Fix Frederik Fix
......
...@@ -126,6 +126,9 @@ Extensions ...@@ -126,6 +126,9 @@ Extensions
Library Library
------- -------
- Issue #1194222: email.utils.parsedate now returns RFC2822 compliant four
character years even if the message contains RFC822 two character years.
- Issue #8750: Fixed MutableSet's methods to correctly handle reflexive - Issue #8750: Fixed MutableSet's methods to correctly handle reflexive
operations on its self, namely x -= x and x ^= x. operations on its self, namely x -= x and x ^= x.
......
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