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

Skip to content

Commit 816b635

Browse files
[3.12] gh-113199: Make read1() and readline() of HTTPResponse close IO after reading all data (GH-113200) (GH-113259)
(cherry picked from commit 41336a7) Co-authored-by: Illia Volochii <[email protected]>
1 parent 52bbaa9 commit 816b635

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
@@ -665,6 +665,8 @@ def read1(self, n=-1):
665665
self._close_conn()
666666
elif self.length is not None:
667667
self.length -= len(result)
668+
if not self.length:
669+
self._close_conn()
668670
return result
669671

670672
def peek(self, n=-1):
@@ -689,6 +691,8 @@ def readline(self, limit=-1):
689691
self._close_conn()
690692
elif self.length is not None:
691693
self.length -= len(result)
694+
if not self.length:
695+
self._close_conn()
692696
return result
693697

694698
def _read1_chunked(self, n):

Lib/test/test_httplib.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,18 +1546,22 @@ def test_readline(self):
15461546
resp = self.resp
15471547
self._verify_readline(self.resp.readline, self.lines_expected)
15481548

1549-
def _verify_readline(self, readline, expected):
1549+
def test_readline_without_limit(self):
1550+
self._verify_readline(self.resp.readline, self.lines_expected, limit=-1)
1551+
1552+
def _verify_readline(self, readline, expected, limit=5):
15501553
all = []
15511554
while True:
15521555
# short readlines
1553-
line = readline(5)
1556+
line = readline(limit)
15541557
if line and line != b"foo":
15551558
if len(line) < 5:
15561559
self.assertTrue(line.endswith(b"\n"))
15571560
all.append(line)
15581561
if not line:
15591562
break
15601563
self.assertEqual(b"".join(all), expected)
1564+
self.assertTrue(self.resp.isclosed())
15611565

15621566
def test_read1(self):
15631567
resp = self.resp
@@ -1577,6 +1581,7 @@ def test_read1_unbounded(self):
15771581
break
15781582
all.append(data)
15791583
self.assertEqual(b"".join(all), self.lines_expected)
1584+
self.assertTrue(resp.isclosed())
15801585

15811586
def test_read1_bounded(self):
15821587
resp = self.resp
@@ -1588,15 +1593,22 @@ def test_read1_bounded(self):
15881593
self.assertLessEqual(len(data), 10)
15891594
all.append(data)
15901595
self.assertEqual(b"".join(all), self.lines_expected)
1596+
self.assertTrue(resp.isclosed())
15911597

15921598
def test_read1_0(self):
15931599
self.assertEqual(self.resp.read1(0), b"")
1600+
self.assertFalse(self.resp.isclosed())
15941601

15951602
def test_peek_0(self):
15961603
p = self.resp.peek(0)
15971604
self.assertLessEqual(0, len(p))
15981605

15991606

1607+
class ExtendedReadTestContentLengthKnown(ExtendedReadTest):
1608+
_header, _body = ExtendedReadTest.lines.split('\r\n\r\n', 1)
1609+
lines = _header + f'\r\nContent-Length: {len(_body)}\r\n\r\n' + _body
1610+
1611+
16001612
class ExtendedReadTestChunked(ExtendedReadTest):
16011613
"""
16021614
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)