From 8ec7ded3706fe66bf307ed339eb852d73f6d10d0 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Fri, 1 Mar 2019 13:47:09 -0500 Subject: [PATCH] Refs #30227 -- Added helpful message for non-ASCII Content-Type in mulitpart request. --- django/http/multipartparser.py | 5 ++++- tests/requests/tests.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/django/http/multipartparser.py b/django/http/multipartparser.py index 526e161ae45..07a1d676ee5 100644 --- a/django/http/multipartparser.py +++ b/django/http/multipartparser.py @@ -67,7 +67,10 @@ class MultiPartParser: raise MultiPartParserError('Invalid Content-Type: %s' % content_type) # Parse the header to get the boundary to split the parts. - ctypes, opts = parse_header(content_type.encode('ascii')) + try: + ctypes, opts = parse_header(content_type.encode('ascii')) + except UnicodeEncodeError: + raise MultiPartParserError('Invalid non-ASCII Content-Type in multipart: %s' % force_str(content_type)) boundary = opts.get('boundary') if not boundary or not cgi.valid_boundary(boundary): raise MultiPartParserError('Invalid boundary in multipart: %s' % force_str(boundary)) diff --git a/tests/requests/tests.py b/tests/requests/tests.py index 945d77ff6ed..a97b98e8a2f 100644 --- a/tests/requests/tests.py +++ b/tests/requests/tests.py @@ -487,6 +487,17 @@ class RequestsTests(SimpleTestCase): with self.assertRaisesMessage(MultiPartParserError, 'Invalid boundary in multipart: None'): request.POST + def test_multipart_non_ascii_content_type(self): + request = WSGIRequest({ + 'REQUEST_METHOD': 'POST', + 'CONTENT_TYPE': 'multipart/form-data; boundary = \xe0', + 'CONTENT_LENGTH': 0, + 'wsgi.input': FakePayload(), + }) + msg = 'Invalid non-ASCII Content-Type in multipart: multipart/form-data; boundary = à' + with self.assertRaisesMessage(MultiPartParserError, msg): + request.POST + def test_POST_connection_error(self): """ If wsgi.input.read() raises an exception while trying to read() the