Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 44bdb6d

Browse files
[3.11] gh-113199: Make read1() and readline() of HTTPResponse close IO after reading all data (GH-113200) (GH-113260)
(cherry picked from commit 41336a7) Co-authored-by: Illia Volochii <[email protected]>
1 parent 2cd3564 commit 44bdb6d

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

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
self._close_conn()
664664
elif self.length is not None:
665665
self.length -= len(result)
666+
if not self.length:
667+
self._close_conn()
666668
return result
667669

668670
def peek(self, n=-1):
@@ -687,6 +689,8 @@ def readline(self, limit=-1):
687689
self._close_conn()
688690
elif self.length is not None:
689691
self.length -= len(result)
692+
if not self.length:
693+
self._close_conn()
690694
return result
691695

692696
def _read1_chunked(self, n):

Lib/test/test_httplib.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,18 +1503,22 @@ def test_readline(self):
15031503
resp = self.resp
15041504
self._verify_readline(self.resp.readline, self.lines_expected)
15051505

1506-
def _verify_readline(self, readline, expected):
1506+
def test_readline_without_limit(self):
1507+
self._verify_readline(self.resp.readline, self.lines_expected, limit=-1)
1508+
1509+
def _verify_readline(self, readline, expected, limit=5):
15071510
all = []
15081511
while True:
15091512
# short readlines
1510-
line = readline(5)
1513+
line = readline(limit)
15111514
if line and line != b"foo":
15121515
if len(line) < 5:
15131516
self.assertTrue(line.endswith(b"\n"))
15141517
all.append(line)
15151518
if not line:
15161519
break
15171520
self.assertEqual(b"".join(all), expected)
1521+
self.assertTrue(self.resp.isclosed())
15181522

15191523
def test_read1(self):
15201524
resp = self.resp
@@ -1534,6 +1538,7 @@ def test_read1_unbounded(self):
15341538
break
15351539
all.append(data)
15361540
self.assertEqual(b"".join(all), self.lines_expected)
1541+
self.assertTrue(resp.isclosed())
15371542

15381543
def test_read1_bounded(self):
15391544
resp = self.resp
@@ -1545,15 +1550,22 @@ def test_read1_bounded(self):
15451550
self.assertLessEqual(len(data), 10)
15461551
all.append(data)
15471552
self.assertEqual(b"".join(all), self.lines_expected)
1553+
self.assertTrue(resp.isclosed())
15481554

15491555
def test_read1_0(self):
15501556
self.assertEqual(self.resp.read1(0), b"")
1557+
self.assertFalse(self.resp.isclosed())
15511558

15521559
def test_peek_0(self):
15531560
p = self.resp.peek(0)
15541561
self.assertLessEqual(0, len(p))
15551562

15561563

1564+
class ExtendedReadTestContentLengthKnown(ExtendedReadTest):
1565+
_header, _body = ExtendedReadTest.lines.split('\r\n\r\n', 1)
1566+
lines = _header + f'\r\nContent-Length: {len(_body)}\r\n\r\n' + _body
1567+
1568+
15571569
class ExtendedReadTestChunked(ExtendedReadTest):
15581570
"""
15591571
Test peek(), read1(), readline() in chunked mode
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Make ``http.client.HTTPResponse.read1`` and
2+
``http.client.HTTPResponse.readline`` close IO after reading all data when
3+
content length is known. Patch by Illia Volochii.

0 commit comments

Comments
 (0)