]> granicus.if.org Git - python/commitdiff
Recognize '<>' as a special case of an angle-addr in header_value_parser.
authorR David Murray <rdmurray@bitdance.com>
Sat, 26 May 2012 18:31:12 +0000 (14:31 -0400)
committerR David Murray <rdmurray@bitdance.com>
Sat, 26 May 2012 18:31:12 +0000 (14:31 -0400)
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.

Lib/email/_header_value_parser.py
Lib/test/test_email/test__header_value_parser.py

index 87d8f684f514d3fc496dbb6ce2edaf55db451b24..f4a01f19f0751270c8fe7c0aff68594524acedcb 100644 (file)
@@ -791,6 +791,8 @@ class AngleAddr(TokenList):
         for x in self:
             if x.token_type == 'addr-spec':
                 return x.addr_spec
+        else:
+            return '<>'
 
 
 class ObsRoute(TokenList):
@@ -1829,6 +1831,14 @@ def get_angle_addr(value):
             "expected angle-addr but found '{}'".format(value))
     angle_addr.append(ValueTerminal('<', 'angle-addr-start'))
     value = value[1:]
+    # Although it is not legal per RFC5322, SMTP uses '<>' in certain
+    # circumstances.
+    if value[0] == '>':
+        angle_addr.append(ValueTerminal('>', 'angle-addr-end'))
+        angle_addr.defects.append(errors.InvalidHeaderDefect(
+            "null addr-spec in angle-addr"))
+        value = value[1:]
+        return angle_addr, value
     try:
         token, value = get_addr_spec(value)
     except errors.HeaderParseError:
@@ -1838,7 +1848,7 @@ def get_angle_addr(value):
                 "obsolete route specification in angle-addr"))
         except errors.HeaderParseError:
             raise errors.HeaderParseError(
-                "expected addr-spec or but found '{}'".format(value))
+                "expected addr-spec or obs-route but found '{}'".format(value))
         angle_addr.append(token)
         token, value = get_addr_spec(value)
     angle_addr.append(token)
index 75fe2998c918fcea6e3449967525adf1ed005603..2161af1d71c522f4e55e5ee00b19b9a703ce77cd 100644 (file)
@@ -1429,6 +1429,19 @@ class TestParser(TestEmailBase):
         self.assertIsNone(angle_addr.route)
         self.assertEqual(angle_addr.addr_spec, 'dinsdale@example.com')
 
+    def test_get_angle_addr_empty(self):
+        angle_addr = self._test_get_x(parser.get_angle_addr,
+            '<>',
+            '<>',
+            '<>',
+            [errors.InvalidHeaderDefect],
+            '')
+        self.assertEqual(angle_addr.token_type, 'angle-addr')
+        self.assertIsNone(angle_addr.local_part)
+        self.assertIsNone(angle_addr.domain)
+        self.assertIsNone(angle_addr.route)
+        self.assertEqual(angle_addr.addr_spec, '<>')
+
     def test_get_angle_addr_with_cfws(self):
         angle_addr = self._test_get_x(parser.get_angle_addr,
             ' (foo) <dinsdale@example.com>(bar)',
@@ -2007,7 +2020,7 @@ class TestParser(TestEmailBase):
         self.assertEqual(group.mailboxes,
                          group.all_mailboxes)
 
-    def test_get_troup_null_addr_spec(self):
+    def test_get_group_null_addr_spec(self):
         group = self._test_get_x(parser.get_group,
             'foo: <>;',
             'foo: <>;',