From 2cef45b8e58d5d103723dada8737cee530248e97 Mon Sep 17 00:00:00 2001 From: TyrannosourceExe Date: Wed, 16 May 2018 10:15:10 -0400 Subject: [PATCH] patched string index out of range error in get_word function of _header_value_parser.py and created tests in test__header_value_parser.py for CFWS. --- Lib/email/_header_value_parser.py | 16 ++++++++---- .../test_email/test__header_value_parser.py | 25 +++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index d8becee19892c8..c99d046cae8168 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -1336,15 +1336,21 @@ def get_word(value): leader, value = get_cfws(value) else: leader = None - if value[0]=='"': - token, value = get_quoted_string(value) - elif value[0] in SPECIALS: - raise errors.HeaderParseError("Expected 'atom' or 'quoted-string' " - "but found '{}'".format(value)) + if value: + if value[0]=='"': + token, value = get_quoted_string(value) + elif value[0] in SPECIALS: + raise errors.HeaderParseError("Expected 'atom' or 'quoted-string' " + "but found '{}'".format(value)) + else: + token, value = get_atom(value) + if leader is not None: + token[:0] = [leader] else: token, value = get_atom(value) if leader is not None: token[:0] = [leader] + return token, value def get_phrase(value): diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 5cdc4bcecad447..f7e277f764a1da 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -901,6 +901,20 @@ def test_get_word_atom_yields_atom(self): self.assertEqual(word.token_type, 'atom') self.assertEqual(word[0].token_type, 'cfws') + def test_get_word_all_CFWS(self): + word = self._test_get_x(parser.get_word, + '(Recipients list suppressed', + str(parser.CFWSList([parser.Comment([ + parser.WhiteSpaceTerminal('Recipients', 'ptext'), + parser.WhiteSpaceTerminal(' ', 'fws'), + parser.WhiteSpaceTerminal('list', 'ptext'), + parser.WhiteSpaceTerminal(' ', 'fws'), + parser.WhiteSpaceTerminal('suppressed', 'ptext') + ])])), + ' ', [], '' + ) + self.assertEqual(word.token_type, 'cfws') + def test_get_word_qs_yields_qs(self): word = self._test_get_x(parser.get_word, '"bar " (bang) ah', '"bar " (bang) ', 'bar ', [], 'ah') @@ -2289,6 +2303,17 @@ def test_get_address_quoted_strings_in_atom_list(self): # get_address_list + def test_get_address_list_CFWS(self): + address_list = self._test_get_x(parser.get_address_list, + '(Recipient list suppressed)', + '(Recipient list suppressed)', + ' ', + [errors.ObsoleteHeaderDefect], # no content in address list + '') + self.assertEqual(address_list.token_type, 'address-list') + self.assertEqual(len(address_list.mailboxes), 0) + self.assertEqual(address_list.mailboxes, address_list.all_mailboxes) + def test_get_address_list_mailboxes_simple(self): address_list = self._test_get_x(parser.get_address_list, 'dinsdale@example.com',