Skip to content

Commit 68157da

Browse files
authored
bpo-38698: Add a new InvalidMessageID token to email header parser. (GH-17503)
This adds a new InvalidMessageID token to the email header parser which can be used to represent invalid message-id headers in the parse tree.
1 parent 080ee5a commit 68157da

File tree

3 files changed

+56
-7
lines changed

3 files changed

+56
-7
lines changed

Lib/email/_header_value_parser.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -850,10 +850,15 @@ def fold(self, policy):
850850
# message-id tokens may not be folded.
851851
return str(self) + policy.linesep
852852

853+
853854
class MessageID(MsgID):
854855
token_type = 'message-id'
855856

856857

858+
class InvalidMessageID(MessageID):
859+
token_type = 'invalid-message-id'
860+
861+
857862
class Header(TokenList):
858863
token_type = 'header'
859864

@@ -2110,11 +2115,18 @@ def parse_message_id(value):
21102115
message_id = MessageID()
21112116
try:
21122117
token, value = get_msg_id(value)
2113-
except errors.HeaderParseError:
2114-
message_id.defects.append(errors.InvalidHeaderDefect(
2115-
"Expected msg-id but found {!r}".format(value)))
2116-
else:
21172118
message_id.append(token)
2119+
except errors.HeaderParseError as ex:
2120+
token = get_unstructured(value)
2121+
message_id = InvalidMessageID(token)
2122+
message_id.defects.append(
2123+
errors.InvalidHeaderDefect("Invalid msg-id: {!r}".format(ex)))
2124+
else:
2125+
# Value after parsing a valid msg_id should be None.
2126+
if value:
2127+
message_id.defects.append(errors.InvalidHeaderDefect(
2128+
"Unexpected {!r}".format(value)))
2129+
21182130
return message_id
21192131

21202132
#

Lib/test/test_email/test__header_value_parser.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2639,10 +2639,44 @@ def test_get_msg_id_no_id_right_part(self):
26392639
self.assertEqual(msg_id.token_type, 'msg-id')
26402640

26412641
def test_get_msg_id_invalid_expected_msg_id_not_found(self):
2642-
text = "Message-Id: 935-XPB-567:0:86089:180874:0:45327:9:90305:[email protected]"
2642+
text = "935-XPB-567:0:45327:9:90305:[email protected]"
26432643
msg_id = parser.parse_message_id(text)
2644-
self.assertDefectsEqual(msg_id.all_defects,
2645-
[errors.InvalidHeaderDefect])
2644+
self.assertDefectsEqual(
2645+
msg_id.all_defects,
2646+
[errors.InvalidHeaderDefect])
2647+
2648+
def test_parse_invalid_message_id(self):
2649+
message_id = self._test_parse_x(
2650+
parser.parse_message_id,
2651+
"935-XPB-567:0:45327:9:90305:[email protected]",
2652+
"935-XPB-567:0:45327:9:90305:[email protected]",
2653+
"935-XPB-567:0:45327:9:90305:[email protected]",
2654+
[errors.InvalidHeaderDefect],
2655+
)
2656+
self.assertEqual(message_id.token_type, 'invalid-message-id')
2657+
2658+
def test_parse_valid_message_id(self):
2659+
message_id = self._test_parse_x(
2660+
parser.parse_message_id,
2661+
"<aperson@somedomain>",
2662+
"<aperson@somedomain>",
2663+
"<aperson@somedomain>",
2664+
[],
2665+
)
2666+
self.assertEqual(message_id.token_type, 'message-id')
2667+
2668+
def test_parse_message_id_with_remaining(self):
2669+
message_id = self._test_parse_x(
2670+
parser.parse_message_id,
2671+
"<validmessageid@example>thensomething",
2672+
"<validmessageid@example>",
2673+
"<validmessageid@example>",
2674+
[errors.InvalidHeaderDefect],
2675+
[],
2676+
)
2677+
self.assertEqual(message_id.token_type, 'message-id')
2678+
self.assertEqual(str(message_id.all_defects[0]),
2679+
"Unexpected 'thensomething'")
26462680

26472681
def test_get_msg_id_no_angle_start(self):
26482682
with self.assertRaises(errors.HeaderParseError):
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Add a new ``InvalidMessageID`` token to email parser to represent invalid
2+
Message-ID headers. Also, add defects when there is remaining value after
3+
parsing the header.

0 commit comments

Comments
 (0)