Rejig response streaming/closing

This commit is contained in:
Tom Christie 2019-04-16 14:04:17 +01:00
parent ee6f42a8f4
commit 63d73ad554
4 changed files with 16 additions and 18 deletions

View 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()

View 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:

View 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(

View File

@ -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",