Rejig response streaming/closing
This commit is contained in:
parent
ee6f42a8f4
commit
63d73ad554
@ -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()
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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(
|
||||
|
||||
Loading…
Reference in New Issue
Block a user