diff options
| author | sammiee5311 <sammiee5311@gmail.com> | 2026-02-16 12:21:03 +0900 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2026-02-24 13:44:42 -0500 |
| commit | e84dc8715e91d51364ba6bda2b2fb07e7a8b750e (patch) | |
| tree | 60b14a481d6a4745a71354ae5fe0206ee7757f0f | |
| parent | acd0bec51366e259b4c2b43e4c09755541cdf560 (diff) | |
Fixed #36931 -- Handled LookupError in multipart parser for invalid RFC 2231 encoding.
Added LookupError to the except clause so invalid headers are silently
skipped, consistent with other malformed header handling.
| -rw-r--r-- | django/http/multipartparser.py | 2 | ||||
| -rw-r--r-- | tests/requests_tests/tests.py | 19 |
2 files changed, 14 insertions, 7 deletions
diff --git a/django/http/multipartparser.py b/django/http/multipartparser.py index d420c255eb..b834b8b31b 100644 --- a/django/http/multipartparser.py +++ b/django/http/multipartparser.py @@ -726,7 +726,7 @@ def parse_boundary_stream(stream, max_header_size): name = header_name.lower().rstrip(" ") value, params = parse_header_parameters(value_and_params.lstrip(" ")) params = {k: v.encode() for k, v in params.items()} - except ValueError: # Invalid header. + except (ValueError, LookupError): # Invalid header. continue if name == "content-disposition": diff --git a/tests/requests_tests/tests.py b/tests/requests_tests/tests.py index e52989b0da..e1744bf180 100644 --- a/tests/requests_tests/tests.py +++ b/tests/requests_tests/tests.py @@ -455,11 +455,18 @@ class RequestsTests(SimpleTestCase): request.body def test_malformed_multipart_header(self): - for header in [ - 'Content-Disposition : form-data; name="name"', - 'Content-Disposition:form-data; name="name"', - 'Content-Disposition :form-data; name="name"', - ]: + tests = [ + ('Content-Disposition : form-data; name="name"', {"name": ["value"]}), + ('Content-Disposition:form-data; name="name"', {"name": ["value"]}), + ('Content-Disposition :form-data; name="name"', {"name": ["value"]}), + # The invalid encoding causes the entire part to be skipped. + ( + 'Content-Disposition: form-data; name="name"; ' + "filename*=BOGUS''test%20file.txt", + {}, + ), + ] + for header, expected_post in tests: with self.subTest(header): payload = FakePayload( "\r\n".join( @@ -480,7 +487,7 @@ class RequestsTests(SimpleTestCase): "wsgi.input": payload, } ) - self.assertEqual(request.POST, {"name": ["value"]}) + self.assertEqual(request.POST, expected_post) def test_body_after_POST_multipart_related(self): """ |
