From: Tom Christie Date: Tue, 16 Apr 2019 13:04:17 +0000 (+0100) Subject: Rejig response streaming/closing X-Git-Tag: 0.1.0~7^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=63d73ad554cb27beef5fa4baa23c712083e24e55;p=thirdparty%2Fhttpx.git Rejig response streaming/closing --- diff --git a/httpcore/connections.py b/httpcore/connections.py index e181cb50..f39a365f 100644 --- a/httpcore/connections.py +++ b/httpcore/connections.py @@ -40,7 +40,7 @@ class Connection: except asyncio.TimeoutError: raise ConnectTimeout() - async def send(self, request: Request, stream: bool = False) -> Response: + async def send(self, request: Request) -> Response: method = request.method.encode() target = request.url.target headers = request.headers @@ -69,21 +69,10 @@ class Connection: assert isinstance(event, h11.Response) status_code = event.status_code headers = event.headers - - if stream: - body_iter = self.body_iter() - return Response(status_code=status_code, headers=headers, body=body_iter) - - #  Get the response body. - body = b"" - event = await self._receive_event() - while isinstance(event, h11.Data): - body += event.data - event = await self._receive_event() - assert isinstance(event, h11.EndOfMessage) - await self.close() - - return Response(status_code=status_code, headers=headers, body=body) + body = self.body_iter() + return Response( + status_code=status_code, headers=headers, body=body, on_close=self.close + ) async def body_iter(self) -> typing.AsyncIterator[bytes]: event = await self._receive_event() diff --git a/httpcore/datastructures.py b/httpcore/datastructures.py index 28f3bf91..5f84b466 100644 --- a/httpcore/datastructures.py +++ b/httpcore/datastructures.py @@ -190,6 +190,10 @@ class Response: await self.close() async def close(self) -> None: + """ + Close the response and release the connection. + Automatically called if the response body is read to completion. + """ if not self.is_closed: self.is_closed = True if self.on_close is not None: diff --git a/httpcore/pool.py b/httpcore/pool.py index 75948477..6446c39a 100644 --- a/httpcore/pool.py +++ b/httpcore/pool.py @@ -43,7 +43,12 @@ class ConnectionPool: request = Request(method, parsed_url, headers=headers, body=body) ssl_context = await self.get_ssl_context(parsed_url) connection = await self.acquire_connection(parsed_url, ssl=ssl_context) - response = await connection.send(request, stream=stream) + response = await connection.send(request) + if not stream: + try: + await response.read() + finally: + await response.close() return response async def acquire_connection( diff --git a/setup.py b/setup.py index bf42cf4c..6d709be2 100644 --- a/setup.py +++ b/setup.py @@ -47,7 +47,7 @@ setup( author_email="tom@tomchristie.com", packages=get_packages("httpcore"), data_files=[("", ["LICENSE.md"])], - install_requires=["h11"], + install_requires=["h11", "certifi"], classifiers=[ "Development Status :: 3 - Alpha", "Environment :: Web Environment",