From 7cc138a58f73c17f07cfaf459ef8e7677ac41ac0 Mon Sep 17 00:00:00 2001 From: benebsiny Date: Tue, 6 Jun 2023 16:31:49 +0800 Subject: [PATCH] Added MultiPartParser tests for parsing base64-encoded fields. --- tests/requests_tests/tests.py | 52 ++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/tests/requests_tests/tests.py b/tests/requests_tests/tests.py index d3e9e66224..79f82741db 100644 --- a/tests/requests_tests/tests.py +++ b/tests/requests_tests/tests.py @@ -14,7 +14,7 @@ from django.http import ( from django.http.multipartparser import MultiPartParserError from django.http.request import split_domain_port from django.test import RequestFactory, SimpleTestCase, override_settings -from django.test.client import FakePayload +from django.test.client import BOUNDARY, MULTIPART_CONTENT, FakePayload class RequestsTests(SimpleTestCase): @@ -537,6 +537,56 @@ class RequestsTests(SimpleTestCase): self.assertEqual(request.read(1), b"n") self.assertEqual(request.POST, {"name": ["value"]}) + def test_multipart_post_field_with_base64(self): + payload = FakePayload( + "\r\n".join( + [ + f"--{BOUNDARY}", + 'Content-Disposition: form-data; name="name"', + "Content-Transfer-Encoding: base64", + "", + "dmFsdWU=", + f"--{BOUNDARY}--", + "", + ] + ) + ) + request = WSGIRequest( + { + "REQUEST_METHOD": "POST", + "CONTENT_TYPE": MULTIPART_CONTENT, + "CONTENT_LENGTH": len(payload), + "wsgi.input": payload, + } + ) + request.body # evaluate + self.assertEqual(request.POST, {"name": ["value"]}) + + def test_multipart_post_field_with_invalid_base64(self): + payload = FakePayload( + "\r\n".join( + [ + f"--{BOUNDARY}", + 'Content-Disposition: form-data; name="name"', + "Content-Transfer-Encoding: base64", + "", + "123", + f"--{BOUNDARY}--", + "", + ] + ) + ) + request = WSGIRequest( + { + "REQUEST_METHOD": "POST", + "CONTENT_TYPE": MULTIPART_CONTENT, + "CONTENT_LENGTH": len(payload), + "wsgi.input": payload, + } + ) + request.body # evaluate + self.assertEqual(request.POST, {"name": ["123"]}) + def test_POST_after_body_read_and_stream_read_multipart(self): """ POST should be populated even if body is read first, and then