Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 032eed3

Browse files
committed
Recognize '<>' as a special case of an angle-addr in header_value_parser.
Although '<>' is invalid according to RFC 5322, SMTP uses it for various things, and it sometimes ends up in email headers. This patch changes get_angle_addr to recognize it and just register a Defect instead of raising a parsing error.
1 parent d785cb3 commit 032eed3

2 files changed

Lines changed: 25 additions & 2 deletions

File tree

Lib/email/_header_value_parser.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,8 @@ def addr_spec(self):
791791
for x in self:
792792
if x.token_type == 'addr-spec':
793793
return x.addr_spec
794+
else:
795+
return '<>'
794796

795797

796798
class ObsRoute(TokenList):
@@ -1829,6 +1831,14 @@ def get_angle_addr(value):
18291831
"expected angle-addr but found '{}'".format(value))
18301832
angle_addr.append(ValueTerminal('<', 'angle-addr-start'))
18311833
value = value[1:]
1834+
# Although it is not legal per RFC5322, SMTP uses '<>' in certain
1835+
# circumstances.
1836+
if value[0] == '>':
1837+
angle_addr.append(ValueTerminal('>', 'angle-addr-end'))
1838+
angle_addr.defects.append(errors.InvalidHeaderDefect(
1839+
"null addr-spec in angle-addr"))
1840+
value = value[1:]
1841+
return angle_addr, value
18321842
try:
18331843
token, value = get_addr_spec(value)
18341844
except errors.HeaderParseError:
@@ -1838,7 +1848,7 @@ def get_angle_addr(value):
18381848
"obsolete route specification in angle-addr"))
18391849
except errors.HeaderParseError:
18401850
raise errors.HeaderParseError(
1841-
"expected addr-spec or but found '{}'".format(value))
1851+
"expected addr-spec or obs-route but found '{}'".format(value))
18421852
angle_addr.append(token)
18431853
token, value = get_addr_spec(value)
18441854
angle_addr.append(token)

Lib/test/test_email/test__header_value_parser.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1429,6 +1429,19 @@ def test_get_angle_addr_simple(self):
14291429
self.assertIsNone(angle_addr.route)
14301430
self.assertEqual(angle_addr.addr_spec, '[email protected]')
14311431

1432+
def test_get_angle_addr_empty(self):
1433+
angle_addr = self._test_get_x(parser.get_angle_addr,
1434+
'<>',
1435+
'<>',
1436+
'<>',
1437+
[errors.InvalidHeaderDefect],
1438+
'')
1439+
self.assertEqual(angle_addr.token_type, 'angle-addr')
1440+
self.assertIsNone(angle_addr.local_part)
1441+
self.assertIsNone(angle_addr.domain)
1442+
self.assertIsNone(angle_addr.route)
1443+
self.assertEqual(angle_addr.addr_spec, '<>')
1444+
14321445
def test_get_angle_addr_with_cfws(self):
14331446
angle_addr = self._test_get_x(parser.get_angle_addr,
14341447
' (foo) <[email protected]>(bar)',
@@ -2007,7 +2020,7 @@ def test_get_group_empty(self):
20072020
self.assertEqual(group.mailboxes,
20082021
group.all_mailboxes)
20092022

2010-
def test_get_troup_null_addr_spec(self):
2023+
def test_get_group_null_addr_spec(self):
20112024
group = self._test_get_x(parser.get_group,
20122025
'foo: <>;',
20132026
'foo: <>;',

0 commit comments

Comments
 (0)