|
1 | 1 | from __future__ import annotations
|
2 | 2 |
|
3 | 3 | from itertools import chain
|
4 |
| -from typing import TYPE_CHECKING, Any, cast |
| 4 | +from typing import TYPE_CHECKING, Any |
5 | 5 |
|
6 | 6 | from msgspec.msgpack import decode as _decode_msgpack_plain
|
7 | 7 |
|
8 |
| -from litestar.datastructures.upload_file import UploadFile |
| 8 | +from litestar.datastructures.multi_dicts import FormMultiDict |
9 | 9 | from litestar.enums import HttpMethod, MediaType, ScopeType
|
10 | 10 | from litestar.exceptions import ClientException, ImproperlyConfiguredException, SerializationException
|
11 | 11 | from litestar.handlers.http_handlers import HTTPRouteHandler
|
@@ -77,17 +77,18 @@ async def handle(self, scope: HTTPScope, receive: Receive, send: Send) -> None:
|
77 | 77 | if route_handler.resolve_guards():
|
78 | 78 | await route_handler.authorize_connection(connection=request)
|
79 | 79 |
|
80 |
| - response = await self._get_response_for_request( |
81 |
| - scope=scope, request=request, route_handler=route_handler, parameter_model=parameter_model |
82 |
| - ) |
83 |
| - |
84 |
| - await response(scope, receive, send) |
| 80 | + try: |
| 81 | + response = await self._get_response_for_request( |
| 82 | + scope=scope, request=request, route_handler=route_handler, parameter_model=parameter_model |
| 83 | + ) |
85 | 84 |
|
86 |
| - if after_response_handler := route_handler.resolve_after_response(): |
87 |
| - await after_response_handler(request) |
| 85 | + await response(scope, receive, send) |
88 | 86 |
|
89 |
| - if form_data := scope.get("_form", {}): |
90 |
| - await self._cleanup_temporary_files(form_data=cast("dict[str, Any]", form_data)) |
| 87 | + if after_response_handler := route_handler.resolve_after_response(): |
| 88 | + await after_response_handler(request) |
| 89 | + finally: |
| 90 | + if (form_data := ScopeState.from_scope(scope).form) is not Empty: |
| 91 | + await FormMultiDict.from_form_data(form_data).close() |
91 | 92 |
|
92 | 93 | def create_handler_map(self) -> None:
|
93 | 94 | """Parse the ``router_handlers`` of this route and return a mapping of
|
@@ -258,9 +259,3 @@ def options_handler(scope: Scope) -> Response:
|
258 | 259 | include_in_schema=False,
|
259 | 260 | sync_to_thread=False,
|
260 | 261 | )(options_handler)
|
261 |
| - |
262 |
| - @staticmethod |
263 |
| - async def _cleanup_temporary_files(form_data: dict[str, Any]) -> None: |
264 |
| - for v in form_data.values(): |
265 |
| - if isinstance(v, UploadFile) and not v.file.closed: |
266 |
| - await v.close() |
0 commit comments