mirror of https://github.com/python/cpython
parent
7e4b9057b3
commit
155ceaa454
|
@ -33,7 +33,7 @@ NLCRE_eol = re.compile('(\r\n|\r|\n)\Z')
|
||||||
NLCRE_crack = re.compile('(\r\n|\r|\n)')
|
NLCRE_crack = re.compile('(\r\n|\r|\n)')
|
||||||
# RFC 2822 $3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character
|
# RFC 2822 $3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character
|
||||||
# except controls, SP, and ":".
|
# except controls, SP, and ":".
|
||||||
headerRE = re.compile(r'^(From |[\041-\071\073-\176]{1,}:|[\t ])')
|
headerRE = re.compile(r'^(From |[\041-\071\073-\176]*:|[\t ])')
|
||||||
EMPTYSTRING = ''
|
EMPTYSTRING = ''
|
||||||
NL = '\n'
|
NL = '\n'
|
||||||
|
|
||||||
|
@ -511,6 +511,15 @@ class FeedParser:
|
||||||
# There will always be a colon, because if there wasn't the part of
|
# There will always be a colon, because if there wasn't the part of
|
||||||
# the parser that calls us would have started parsing the body.
|
# the parser that calls us would have started parsing the body.
|
||||||
i = line.find(':')
|
i = line.find(':')
|
||||||
|
|
||||||
|
# If the colon is on the start of the line the header is clearly
|
||||||
|
# malformed, but we might be able to salvage the rest of the
|
||||||
|
# message. Track the error but keep going.
|
||||||
|
if i == 0:
|
||||||
|
defect = errors.InvalidHeaderDefect("Missing header name.")
|
||||||
|
self._cur.defects.append(defect)
|
||||||
|
continue
|
||||||
|
|
||||||
assert i>0, "_parse_headers fed line with no : and no leading WS"
|
assert i>0, "_parse_headers fed line with no : and no leading WS"
|
||||||
lastheader = line[:i]
|
lastheader = line[:i]
|
||||||
lastvalue = [line]
|
lastvalue = [line]
|
||||||
|
|
|
@ -3389,6 +3389,12 @@ class TestFeedParsers(TestEmailBase):
|
||||||
feedparser.feed(chunk)
|
feedparser.feed(chunk)
|
||||||
return feedparser.close()
|
return feedparser.close()
|
||||||
|
|
||||||
|
def test_empty_header_name_handled(self):
|
||||||
|
# Issue 19996
|
||||||
|
msg = self.parse("First: val\n: bad\nSecond: val")
|
||||||
|
self.assertEqual(msg['First'], 'val')
|
||||||
|
self.assertEqual(msg['Second'], 'val')
|
||||||
|
|
||||||
def test_newlines(self):
|
def test_newlines(self):
|
||||||
m = self.parse(['a:\nb:\rc:\r\nd:\n'])
|
m = self.parse(['a:\nb:\rc:\r\nd:\n'])
|
||||||
self.assertEqual(m.keys(), ['a', 'b', 'c', 'd'])
|
self.assertEqual(m.keys(), ['a', 'b', 'c', 'd'])
|
||||||
|
|
|
@ -167,6 +167,16 @@ class HeaderTests(TestCase):
|
||||||
conn.request('GET', '/foo')
|
conn.request('GET', '/foo')
|
||||||
self.assertTrue(sock.data.startswith(expected))
|
self.assertTrue(sock.data.startswith(expected))
|
||||||
|
|
||||||
|
def test_malformed_headers_coped_with(self):
|
||||||
|
# Issue 19996
|
||||||
|
body = "HTTP/1.1 200 OK\r\nFirst: val\r\n: nval\r\nSecond: val\r\n\r\n"
|
||||||
|
sock = FakeSocket(body)
|
||||||
|
resp = client.HTTPResponse(sock)
|
||||||
|
resp.begin()
|
||||||
|
|
||||||
|
self.assertEqual(resp.getheader('First'), 'val')
|
||||||
|
self.assertEqual(resp.getheader('Second'), 'val')
|
||||||
|
|
||||||
|
|
||||||
class BasicTest(TestCase):
|
class BasicTest(TestCase):
|
||||||
def test_status_lines(self):
|
def test_status_lines(self):
|
||||||
|
|
|
@ -47,6 +47,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #19996: :class:`email.feedparser.FeedParser` now handles (malformed)
|
||||||
|
headers with no key rather than amusing the body has started.
|
||||||
|
|
||||||
- Issue #23248: Update ssl error codes from latest OpenSSL git master.
|
- Issue #23248: Update ssl error codes from latest OpenSSL git master.
|
||||||
|
|
||||||
- Issue #23098: 64-bit dev_t is now supported in the os module.
|
- Issue #23098: 64-bit dev_t is now supported in the os module.
|
||||||
|
|
Loading…
Reference in New Issue