From 7f7a470090d9600779d372adcd3b6a1f91ef35cc Mon Sep 17 00:00:00 2001 From: amir ghasemi Date: Tue, 1 Apr 2025 13:27:10 -0700 Subject: [PATCH 1/2] fix: make MultiPartParser read the default max_part_size from class attr --- starlette/formparsers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/starlette/formparsers.py b/starlette/formparsers.py index 4551d6887..d9fa4fea9 100644 --- a/starlette/formparsers.py +++ b/starlette/formparsers.py @@ -134,7 +134,7 @@ def __init__( *, max_files: int | float = 1000, max_fields: int | float = 1000, - max_part_size: int = 1024 * 1024, # 1MB + max_part_size: int | None = None, ) -> None: assert multipart is not None, "The `python-multipart` library must be installed to use form parsing." self.headers = headers @@ -151,7 +151,8 @@ def __init__( self._file_parts_to_write: list[tuple[MultipartPart, bytes]] = [] self._file_parts_to_finish: list[MultipartPart] = [] self._files_to_close_on_error: list[SpooledTemporaryFile[bytes]] = [] - self.max_part_size = max_part_size + if max_part_size is not None: + self.max_part_size = max_part_size def on_part_begin(self) -> None: self._current_part = MultipartPart() From ddd076c6ab6ad449d2e800354ca558df0eb8dcce Mon Sep 17 00:00:00 2001 From: amir ghasemi Date: Tue, 1 Apr 2025 16:32:08 -0700 Subject: [PATCH 2/2] chore: fix test coverage --- starlette/requests.py | 4 ++-- tests/test_formparsers.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/starlette/requests.py b/starlette/requests.py index 7dc04a746..557101898 100644 --- a/starlette/requests.py +++ b/starlette/requests.py @@ -254,7 +254,7 @@ async def _get_form( *, max_files: int | float = 1000, max_fields: int | float = 1000, - max_part_size: int = 1024 * 1024, + max_part_size: int | None = None, ) -> FormData: if self._form is None: # pragma: no branch assert parse_options_header is not None, ( @@ -289,7 +289,7 @@ def form( *, max_files: int | float = 1000, max_fields: int | float = 1000, - max_part_size: int = 1024 * 1024, + max_part_size: int | None = None, ) -> AwaitableOrContextManager[FormData]: return AwaitableOrContextManagerWrapper( self._get_form(max_files=max_files, max_fields=max_fields, max_part_size=max_part_size) diff --git a/tests/test_formparsers.py b/tests/test_formparsers.py index b18fd6c40..9931987fd 100644 --- a/tests/test_formparsers.py +++ b/tests/test_formparsers.py @@ -104,7 +104,7 @@ async def app_read_body(scope: Scope, receive: Receive, send: Send) -> None: await response(scope, receive, send) -def make_app_max_parts(max_files: int = 1000, max_fields: int = 1000, max_part_size: int = 1024 * 1024) -> ASGIApp: +def make_app_max_parts(max_files: int = 1000, max_fields: int = 1000, max_part_size: int | None = None) -> ASGIApp: async def app(scope: Scope, receive: Receive, send: Send) -> None: request = Request(scope, receive) data = await request.form(max_files=max_files, max_fields=max_fields, max_part_size=max_part_size)