diff --git a/Lib/http/client.py b/Lib/http/client.py index 56f548a1a7e..763a903d42b 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -538,7 +538,7 @@ def readinto(self, b): # connection, and the user is reading more bytes than will be provided # (for example, reading in 1k chunks) n = self.fp.readinto(b) - if not n: + if not n and b: # Ideally, we would raise IncompleteRead if the content-length # wasn't satisfied, but it might break compatibility. self._close_conn() diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 31c0b6a6cae..bcd0a023814 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -164,6 +164,9 @@ def test_status_lines(self): sock = FakeSocket(body) resp = client.HTTPResponse(sock) resp.begin() + self.assertEqual(resp.read(0), b'') # Issue #20007 + self.assertFalse(resp.isclosed()) + self.assertFalse(resp.closed) self.assertEqual(resp.read(), b"Text") self.assertTrue(resp.isclosed()) self.assertFalse(resp.closed) diff --git a/Misc/ACKS b/Misc/ACKS index c0026529b7d..ef6853da078 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1136,6 +1136,7 @@ Adrian Sampson James Sanders Ilya Sandler Rafael Santos +Simon Sapin Mark Sapiro Ty Sarna Hugh Sasse diff --git a/Misc/NEWS b/Misc/NEWS index e8ab0e7c358..458e43ef589 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -44,6 +44,9 @@ Core and Builtins Library ------- +- Issue #20007: HTTPResponse.read(0) no more prematurely closes connection. + Original patch by Simon Sapin. + - Issue #19946: multiprocessing now uses runpy to initialize __main__ in child processes when necessary, allowing it to correctly handle scripts without suffixes and submodules that use explicit relative imports or