(self, app: ASGI3Application)
| 411 | |
| 412 | # ASGI exception wrapper |
| 413 | async def run_asgi(self, app: ASGI3Application) -> None: |
| 414 | try: |
| 415 | result = await app( # type: ignore[func-returns-value] |
| 416 | self.scope, self.receive, self.send |
| 417 | ) |
| 418 | except BaseException as exc: |
| 419 | msg = "Exception in ASGI application\n" |
| 420 | self.logger.error(msg, exc_info=exc) |
| 421 | if not self.response_started: |
| 422 | await self.send_500_response() |
| 423 | else: |
| 424 | self.transport.close() |
| 425 | else: |
| 426 | if result is not None: |
| 427 | msg = "ASGI callable should return None, but returned '%s'." |
| 428 | self.logger.error(msg, result) |
| 429 | self.transport.close() |
| 430 | elif not self.response_started and not self.disconnected: |
| 431 | msg = "ASGI callable returned without starting response." |
| 432 | self.logger.error(msg) |
| 433 | await self.send_500_response() |
| 434 | elif not self.response_complete and not self.disconnected: |
| 435 | msg = "ASGI callable returned without completing response." |
| 436 | self.logger.error(msg) |
| 437 | self.transport.close() |
| 438 | finally: |
| 439 | self.on_response = lambda: None |
| 440 | |
| 441 | async def send_500_response(self) -> None: |
| 442 | response_start_event: HTTPResponseStartEvent = { |
no test coverage detected