Skip to content

Commit 9878730

Browse files
committed
gh-115997: Make HTTPResponse.read1 and readline raise IncompleteRead
1 parent 686ec17 commit 9878730

3 files changed

Lines changed: 32 additions & 0 deletions

File tree

Lib/http/client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,8 @@ def read1(self, n=-1):
663663
result = self.fp.read1(n)
664664
if not result and n:
665665
self._close_conn()
666+
if self.length:
667+
raise IncompleteRead(result, self.length)
666668
elif self.length is not None:
667669
self.length -= len(result)
668670
if not self.length:
@@ -689,6 +691,8 @@ def readline(self, limit=-1):
689691
result = self.fp.readline(limit)
690692
if not result and limit:
691693
self._close_conn()
694+
if self.length:
695+
raise IncompleteRead(result, self.length)
692696
elif self.length is not None:
693697
self.length -= len(result)
694698
if not self.length:

Lib/test/test_httplib.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,6 +1608,30 @@ class ExtendedReadTestContentLengthKnown(ExtendedReadTest):
16081608
_header, _body = ExtendedReadTest.lines.split('\r\n\r\n', 1)
16091609
lines = _header + f'\r\nContent-Length: {len(_body)}\r\n\r\n' + _body
16101610

1611+
def _test_incomplete_read(self, read_meth):
1612+
resp = self.resp
1613+
# Reduce the size of content the response object will read to
1614+
# cause the incomplete read.
1615+
resp.fp.read(1)
1616+
with self.assertRaises(client.IncompleteRead) as cm:
1617+
while True:
1618+
data = resp.read1()
1619+
if not data:
1620+
break
1621+
exception = cm.exception
1622+
self.assertEqual(exception.partial, b"")
1623+
self.assertEqual(exception.expected, 1)
1624+
self.assertTrue(resp.isclosed())
1625+
1626+
def test_read_incomplete_read(self):
1627+
self._test_incomplete_read(self.resp.read)
1628+
1629+
def test_read1_incomplete_read(self):
1630+
self._test_incomplete_read(self.resp.read1)
1631+
1632+
def test_readline_incomplete_read(self):
1633+
self._test_incomplete_read(self.resp.readline)
1634+
16111635

16121636
class ExtendedReadTestChunked(ExtendedReadTest):
16131637
"""
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Make ``http.client.HTTPResponse.read1`` and
2+
``http.client.HTTPResponse.readline`` raise :exc:`IncompleteRead` instead of
3+
returning zero bytes if a connection is closed before an expected number of
4+
bytes has been read. Patch by Illia Volochii.

0 commit comments

Comments
 (0)