async def call_next(self, request: Request) -> ASGIInstance: inner = self.app(dict(request)) loop = asyncio.get_event_loop() queue = asyncio.Queue() # type: asyncio.Queue async def coro() -> None: try: await inner(request.receive, queue.put) finally: await queue.put(None) task = loop.create_task(coro()) message = await queue.get() if message is None: task.result() raise RuntimeError("No response returned.") assert message["type"] == "http.response.start" async def body_stream() -> typing.AsyncGenerator[bytes, None]: while True: message = await queue.get() if message is None: break assert message["type"] == "http.response.body" yield message["body"] task.result() response = StreamingResponse(status_code=message["status"], content=body_stream()) response.raw_headers = message["headers"] return response
async def call_next(self, request: Request) -> Response: loop = asyncio.get_event_loop() queue: "asyncio.Queue[typing.Optional[Message]]" = asyncio.Queue() scope = request.scope receive = request.receive send = queue.put async def coro() -> None: try: await self.app(scope, receive, send) finally: await queue.put(None) task = loop.create_task(coro()) message = await queue.get() if message is None: task.result() raise RuntimeError("No response returned.") assert message["type"] == "http.response.start" async def body_stream() -> typing.AsyncGenerator[bytes, None]: while True: message = await queue.get() if message is None: break assert message["type"] == "http.response.body" yield message.get("body", b"") task.result() response = StreamingResponse(status_code=message["status"], content=body_stream()) response.raw_headers = message["headers"] return response
async def call_next(request: Request) -> Response: app_exc: typing.Optional[Exception] = None send_stream, recv_stream = anyio.create_memory_object_stream() async def coro() -> None: nonlocal app_exc async with send_stream: try: await self.app(scope, request.receive, send_stream.send) except Exception as exc: app_exc = exc task_group.start_soon(coro) try: message = await recv_stream.receive() except anyio.EndOfStream: if app_exc is not None: raise app_exc raise RuntimeError("No response returned.") assert message["type"] == "http.response.start" async def body_stream() -> typing.AsyncGenerator[bytes, None]: async with recv_stream: async for message in recv_stream: assert message["type"] == "http.response.body" yield message.get("body", b"") response = StreamingResponse(status_code=message["status"], content=body_stream()) response.raw_headers = message["headers"] return response
async def call_next(self, request: Request): import asyncio from starlette.responses import StreamingResponse inner = self.app(dict(request)) loop = asyncio.get_event_loop() queue = asyncio.Queue() # type: asyncio.Queue async def coro() -> None: try: await inner(request.receive, queue.put) finally: await queue.put(None) task = loop.create_task(coro()) message = await queue.get() if message is None: task.result() raise RuntimeError("No response returned.") scope = dict(request) if 'http.response.template' in scope.get("extensions", {}): if message["type"] == "http.response.template": await self._orig_send(message) message = await queue.get() assert message["type"] == "http.response.start", message['type'] async def body_stream(): while True: message = await queue.get() if message is None: break assert message["type"] == "http.response.body" yield message["body"] task.result() response = StreamingResponse(status_code=message["status"], content=body_stream()) response.raw_headers = message["headers"] return response