mirror of
https://github.com/python/cpython.git
synced 2025-12-11 03:20:01 +00:00
gh-113199: Make read1() and readline() of HTTPResponse close IO after reading all data (GH-113200)
This commit is contained in:
parent
2feec0fc7f
commit
41336a72b9
3 changed files with 21 additions and 2 deletions
|
|
@ -665,6 +665,8 @@ class HTTPResponse(io.BufferedIOBase):
|
||||||
self._close_conn()
|
self._close_conn()
|
||||||
elif self.length is not None:
|
elif self.length is not None:
|
||||||
self.length -= len(result)
|
self.length -= len(result)
|
||||||
|
if not self.length:
|
||||||
|
self._close_conn()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def peek(self, n=-1):
|
def peek(self, n=-1):
|
||||||
|
|
@ -689,6 +691,8 @@ class HTTPResponse(io.BufferedIOBase):
|
||||||
self._close_conn()
|
self._close_conn()
|
||||||
elif self.length is not None:
|
elif self.length is not None:
|
||||||
self.length -= len(result)
|
self.length -= len(result)
|
||||||
|
if not self.length:
|
||||||
|
self._close_conn()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def _read1_chunked(self, n):
|
def _read1_chunked(self, n):
|
||||||
|
|
|
||||||
|
|
@ -1546,11 +1546,14 @@ class ExtendedReadTest(TestCase):
|
||||||
resp = self.resp
|
resp = self.resp
|
||||||
self._verify_readline(self.resp.readline, self.lines_expected)
|
self._verify_readline(self.resp.readline, self.lines_expected)
|
||||||
|
|
||||||
def _verify_readline(self, readline, expected):
|
def test_readline_without_limit(self):
|
||||||
|
self._verify_readline(self.resp.readline, self.lines_expected, limit=-1)
|
||||||
|
|
||||||
|
def _verify_readline(self, readline, expected, limit=5):
|
||||||
all = []
|
all = []
|
||||||
while True:
|
while True:
|
||||||
# short readlines
|
# short readlines
|
||||||
line = readline(5)
|
line = readline(limit)
|
||||||
if line and line != b"foo":
|
if line and line != b"foo":
|
||||||
if len(line) < 5:
|
if len(line) < 5:
|
||||||
self.assertTrue(line.endswith(b"\n"))
|
self.assertTrue(line.endswith(b"\n"))
|
||||||
|
|
@ -1558,6 +1561,7 @@ class ExtendedReadTest(TestCase):
|
||||||
if not line:
|
if not line:
|
||||||
break
|
break
|
||||||
self.assertEqual(b"".join(all), expected)
|
self.assertEqual(b"".join(all), expected)
|
||||||
|
self.assertTrue(self.resp.isclosed())
|
||||||
|
|
||||||
def test_read1(self):
|
def test_read1(self):
|
||||||
resp = self.resp
|
resp = self.resp
|
||||||
|
|
@ -1577,6 +1581,7 @@ class ExtendedReadTest(TestCase):
|
||||||
break
|
break
|
||||||
all.append(data)
|
all.append(data)
|
||||||
self.assertEqual(b"".join(all), self.lines_expected)
|
self.assertEqual(b"".join(all), self.lines_expected)
|
||||||
|
self.assertTrue(resp.isclosed())
|
||||||
|
|
||||||
def test_read1_bounded(self):
|
def test_read1_bounded(self):
|
||||||
resp = self.resp
|
resp = self.resp
|
||||||
|
|
@ -1588,15 +1593,22 @@ class ExtendedReadTest(TestCase):
|
||||||
self.assertLessEqual(len(data), 10)
|
self.assertLessEqual(len(data), 10)
|
||||||
all.append(data)
|
all.append(data)
|
||||||
self.assertEqual(b"".join(all), self.lines_expected)
|
self.assertEqual(b"".join(all), self.lines_expected)
|
||||||
|
self.assertTrue(resp.isclosed())
|
||||||
|
|
||||||
def test_read1_0(self):
|
def test_read1_0(self):
|
||||||
self.assertEqual(self.resp.read1(0), b"")
|
self.assertEqual(self.resp.read1(0), b"")
|
||||||
|
self.assertFalse(self.resp.isclosed())
|
||||||
|
|
||||||
def test_peek_0(self):
|
def test_peek_0(self):
|
||||||
p = self.resp.peek(0)
|
p = self.resp.peek(0)
|
||||||
self.assertLessEqual(0, len(p))
|
self.assertLessEqual(0, len(p))
|
||||||
|
|
||||||
|
|
||||||
|
class ExtendedReadTestContentLengthKnown(ExtendedReadTest):
|
||||||
|
_header, _body = ExtendedReadTest.lines.split('\r\n\r\n', 1)
|
||||||
|
lines = _header + f'\r\nContent-Length: {len(_body)}\r\n\r\n' + _body
|
||||||
|
|
||||||
|
|
||||||
class ExtendedReadTestChunked(ExtendedReadTest):
|
class ExtendedReadTestChunked(ExtendedReadTest):
|
||||||
"""
|
"""
|
||||||
Test peek(), read1(), readline() in chunked mode
|
Test peek(), read1(), readline() in chunked mode
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
Make ``http.client.HTTPResponse.read1`` and
|
||||||
|
``http.client.HTTPResponse.readline`` close IO after reading all data when
|
||||||
|
content length is known. Patch by Illia Volochii.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue