From 1061f18bebb808c95cde8c8a0a7d55e7ed87dbc6 Mon Sep 17 00:00:00 2001 From: "R. David Murray" Date: Wed, 25 Aug 2010 01:55:24 +0000 Subject: Merged revisions 84310 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r84310 | r.david.murray | 2010-08-24 20:45:55 -0400 (Tue, 24 Aug 2010) | 8 lines #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. ........ --- Lib/email/_parseaddr.py | 12 ++++++++++++ Lib/email/test/test_email.py | 13 +++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 29 insertions(+) diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py index 81913a3..ac2e524 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 0559142..d5ac9c4 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -2230,6 +2230,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 62be7ab..5cd1e3d 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -241,6 +241,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 3344d27..48f1b9a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -95,6 +95,9 @@ C-API 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, namely x -= x and x ^= x. -- cgit v0.12