]> git.ipfire.org Git - thirdparty/httpx.git/commitdiff
Rejig response streaming/closing
authorTom Christie <tom@tomchristie.com>
Tue, 16 Apr 2019 13:04:17 +0000 (14:04 +0100)
committerTom Christie <tom@tomchristie.com>
Tue, 16 Apr 2019 13:04:17 +0000 (14:04 +0100)
httpcore/connections.py
httpcore/datastructures.py
httpcore/pool.py
setup.py

index e181cb50ad76f587927557752163b312647f82ba..f39a365f97705f8c00574cebc590706dca660afc 100644 (file)
@@ -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()
index 28f3bf91f92c546208f21ebdbd26adfc7001240e..5f84b4669e93edac0912f30ac2687ca6bdc2acb0 100644 (file)
@@ -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:
index 75948477c321a9d813f6165a7dd17c7f0b0c46f5..6446c39a90d5ae2c81c43161a1f44baa2542febb 100644 (file)
@@ -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(
index bf42cf4cbd15c06df62b015679a1ec9b23740ad0..6d709be2869d9566dfe0d2753851a14dd4d45c9c 100644 (file)
--- 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",