summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2002-12-30 16:21:07 (GMT)
committerBarry Warsaw <barry@python.org>2002-12-30 16:21:07 (GMT)
commit1fb22bb24fd395a12a225b2418ea8d22d5b37610 (patch)
treebbad267f26e08672a69a2a2d36e405889b4f7608
parentedb59c1ee8872d4a9f5e57b39874ca1d115f2fd4 (diff)
downloadcpython-1fb22bb24fd395a12a225b2418ea8d22d5b37610.zip
cpython-1fb22bb24fd395a12a225b2418ea8d22d5b37610.tar.gz
cpython-1fb22bb24fd395a12a225b2418ea8d22d5b37610.tar.bz2
Port rfc822.py changes that didn't make it into this copy,
specifically that dots are allowed in obs-phrase. This fixes parsing of dots in realnames.
-rw-r--r--Lib/email/_parseaddr.py56
1 files changed, 35 insertions, 21 deletions
diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py
index cb2869a..5a0f5b6 100644
--- a/Lib/email/_parseaddr.py
+++ b/Lib/email/_parseaddr.py
@@ -135,8 +135,8 @@ def quote(str):
class AddrlistClass:
"""Address parser class by Ben Escoto.
- To understand what this class does, it helps to have a copy of
- RFC-822 in front of you.
+ To understand what this class does, it helps to have a copy of RFC 2822 in
+ front of you.
Note: this class interface is deprecated and may be removed in the future.
Use rfc822.AddressList instead.
@@ -153,6 +153,10 @@ class AddrlistClass:
self.LWS = ' \t'
self.CR = '\r\n'
self.atomends = self.specials + self.LWS + self.CR
+ # Note that RFC 2822 now specifies `.' as obs-phrase, meaning that it
+ # is obsolete syntax. RFC 2822 requires that we recognize obsolete
+ # syntax, so allow dots in phrases.
+ self.phraseends = self.atomends.replace('.', '')
self.field = field
self.commentlist = []
@@ -170,10 +174,14 @@ class AddrlistClass:
Returns a list containing all of the addresses.
"""
- ad = self.getaddress()
- if ad:
- return ad + self.getaddrlist()
- else: return []
+ result = []
+ while 1:
+ ad = self.getaddress()
+ if ad:
+ result += ad
+ else:
+ break
+ return result
def getaddress(self):
"""Parse the next address."""
@@ -257,7 +265,6 @@ class AddrlistClass:
expectroute = 1
elif self.field[self.pos] == ':':
self.pos = self.pos + 1
- expectaddrspec = 1
else:
adlist = self.getaddrspec()
self.pos = self.pos + 1
@@ -267,7 +274,7 @@ class AddrlistClass:
return adlist
def getaddrspec(self):
- """Parse an RFC-822 addr-spec."""
+ """Parse an RFC 2822 addr-spec."""
aslist = []
self.gotonext()
@@ -318,8 +325,8 @@ class AddrlistClass:
`endchars' is a sequence of allowable end-delimiting characters.
Parsing stops when one of these is encountered.
- If `allowcomments' is non-zero, embedded RFC-822 comments
- are allowed within the parsed fragment.
+ If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed
+ within the parsed fragment.
"""
if self.field[self.pos] != beginchar:
return ''
@@ -353,15 +360,22 @@ class AddrlistClass:
return self.getdelimited('(', ')\r', 1)
def getdomainliteral(self):
- """Parse an RFC-822 domain-literal."""
+ """Parse an RFC 2822 domain-literal."""
return '[%s]' % self.getdelimited('[', ']\r', 0)
- def getatom(self):
- """Parse an RFC-822 atom."""
+ def getatom(self, atomends=None):
+ """Parse an RFC 2822 atom.
+
+ Optional atomends specifies a different set of end token delimiters
+ (the default is to use self.atomends). This is used e.g. in
+ getphraselist() since phrase endings must not include the `.' (which
+ is legal in phrases)."""
atomlist = ['']
+ if atomends is None:
+ atomends = self.atomends
while self.pos < len(self.field):
- if self.field[self.pos] in self.atomends:
+ if self.field[self.pos] in atomends:
break
else: atomlist.append(self.field[self.pos])
self.pos = self.pos + 1
@@ -369,11 +383,11 @@ class AddrlistClass:
return ''.join(atomlist)
def getphraselist(self):
- """Parse a sequence of RFC-822 phrases.
+ """Parse a sequence of RFC 2822 phrases.
- A phrase is a sequence of words, which are in turn either
- RFC-822 atoms or quoted-strings. Phrases are canonicalized
- by squeezing all runs of continuous whitespace into one space.
+ A phrase is a sequence of words, which are in turn either RFC 2822
+ atoms or quoted-strings. Phrases are canonicalized by squeezing all
+ runs of continuous whitespace into one space.
"""
plist = []
@@ -384,14 +398,14 @@ class AddrlistClass:
plist.append(self.getquote())
elif self.field[self.pos] == '(':
self.commentlist.append(self.getcomment())
- elif self.field[self.pos] in self.atomends:
+ elif self.field[self.pos] in self.phraseends:
break
- else: plist.append(self.getatom())
+ else: plist.append(self.getatom(self.phraseends))
return plist
class AddressList(AddrlistClass):
- """An AddressList encapsulates a list of parsed RFC822 addresses."""
+ """An AddressList encapsulates a list of parsed RFC 2822 addresses."""
def __init__(self, field):
AddrlistClass.__init__(self, field)
if field: