diff options
Diffstat (limited to 'tests/utils_tests/test_http.py')
| -rw-r--r-- | tests/utils_tests/test_http.py | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/tests/utils_tests/test_http.py b/tests/utils_tests/test_http.py index d18fb63c0c..3730c2fcf5 100644 --- a/tests/utils_tests/test_http.py +++ b/tests/utils_tests/test_http.py @@ -6,6 +6,7 @@ from unittest import mock from django.test import SimpleTestCase from django.utils.datastructures import MultiValueDict from django.utils.http import ( + MAX_HEADER_LENGTH, base36_to_int, content_disposition_header, escape_leading_slashes, @@ -424,6 +425,8 @@ class EscapeLeadingSlashesTests(unittest.TestCase): class ParseHeaderParameterTests(unittest.TestCase): def test_basic(self): tests = [ + ("", ("", {})), + (None, ("none", {})), ("text/plain", ("text/plain", {})), ("text/vnd.just.made.this.up ; ", ("text/vnd.just.made.this.up", {})), ("text/plain;charset=us-ascii", ("text/plain", {"charset": "us-ascii"})), @@ -448,9 +451,17 @@ class ParseHeaderParameterTests(unittest.TestCase): ("attachment", {"filename": "strange;name", "size": "123"}), ), ( + 'attachment; filename="strange;name";;;;size=123;;;', + ("attachment", {"filename": "strange;name", "size": "123"}), + ), + ( 'form-data; name="files"; filename="fo\\"o;bar"', ("form-data", {"name": "files", "filename": 'fo"o;bar'}), ), + ( + 'form-data; name="files"; filename="\\"fo\\"o;b\\\\ar\\""', + ("form-data", {"name": "files", "filename": '"fo"o;b\\ar"'}), + ), ] for header, expected in tests: with self.subTest(header=header): @@ -480,12 +491,13 @@ class ParseHeaderParameterTests(unittest.TestCase): """ Test wrongly formatted RFC 2231 headers (missing double single quotes). Parsing should not crash (#24209). + But stdlib email still decodes (#35440). """ test_data = ( ( "Content-Type: application/x-stuff; " "title*='This%20is%20%2A%2A%2Afun%2A%2A%2A", - "'This%20is%20%2A%2A%2Afun%2A%2A%2A", + "'This is ***fun***", ), ("Content-Type: application/x-stuff; title*='foo.html", "'foo.html"), ("Content-Type: application/x-stuff; title*=bar.html", "bar.html"), @@ -494,6 +506,37 @@ class ParseHeaderParameterTests(unittest.TestCase): parsed = parse_header_parameters(raw_line) self.assertEqual(parsed[1]["title"], expected_title) + def test_header_max_length(self): + base_header = "Content-Type: application/x-stuff; title*=" + base_header_len = len(base_header) + + test_data = [ + (MAX_HEADER_LENGTH, {}), + (MAX_HEADER_LENGTH, {"max_length": None}), + (MAX_HEADER_LENGTH + 1, {"max_length": None}), + (100, {"max_length": 100}), + ] + for line_length, kwargs in test_data: + with self.subTest(line_length=line_length, kwargs=kwargs): + title = "x" * (line_length - base_header_len) + line = base_header + title + assert len(line) == line_length + + parsed = parse_header_parameters(line, **kwargs) + + expected = ("content-type: application/x-stuff", {"title": title}) + self.assertEqual(parsed, expected) + + def test_header_too_long(self): + test_data = [ + ("x" * (MAX_HEADER_LENGTH + 1), {}), + ("x" * 101, {"max_length": 100}), + ] + for line, kwargs in test_data: + with self.subTest(line_length=len(line), kwargs=kwargs): + with self.assertRaises(ValueError): + parse_header_parameters(line, **kwargs) + class ContentDispositionHeaderTests(unittest.TestCase): def test_basic(self): |
