summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorR. David Murray <rdmurray@bitdance.com>2010-08-25 00:45:55 +0000
committerR. David Murray <rdmurray@bitdance.com>2010-08-25 00:45:55 +0000
commita69b5b34cd06350275a82b778275680c169d1629 (patch)
tree32f46875c839dc46b795a282b54db108641bcf8b
parentf71edf664a473afffb5c7df5d085d589b44aa2c8 (diff)
downloadcpython-a69b5b34cd06350275a82b778275680c169d1629.tar.gz
#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.
-rw-r--r--Lib/email/_parseaddr.py12
-rw-r--r--Lib/email/test/test_email.py13
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
4 files changed, 29 insertions, 0 deletions
diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py
index 81913a3824..ac2e524401 100644
--- a/Lib/email/_parseaddr.py
+++ b/Lib/email/_parseaddr.py
@@ -107,6 +107,18 @@ def parsedate_tz(data):
tss = int(tss)
except ValueError:
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
tz = tz.upper()
if tz in _timezones:
diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py
index c3114695d1..e18ffaf9f5 100644
--- a/Lib/email/test/test_email.py
+++ b/Lib/email/test/test_email.py
@@ -2234,6 +2234,19 @@ class TestMiscellaneous(TestEmailBase):
eq(time.localtime(t)[:6], timetup[:6])
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):
self.assertEqual(utils.parseaddr('<>'), ('', ''))
self.assertEqual(utils.formataddr(utils.parseaddr('<>')), '')
diff --git a/Misc/ACKS b/Misc/ACKS
index d1fc416807..ef92941d88 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -260,6 +260,7 @@ Niels Ferguson
Sebastian Fernandez
Vincent Fiack
Tomer Filiba
+Jeffrey Finkelstein
Russell Finn
Nils Fischbeck
Frederik Fix
diff --git a/Misc/NEWS b/Misc/NEWS
index f7c8cc05a0..1cb67ccf47 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -126,6 +126,9 @@ Extensions
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
operations on its self, namely x -= x and x ^= x.