diff --git a/django/http/multipartparser.py b/django/http/multipartparser.py index 958b519dc3..526e161ae4 100644 --- a/django/http/multipartparser.py +++ b/django/http/multipartparser.py @@ -70,7 +70,7 @@ class MultiPartParser: ctypes, opts = parse_header(content_type.encode('ascii')) boundary = opts.get('boundary') if not boundary or not cgi.valid_boundary(boundary): - raise MultiPartParserError('Invalid boundary in multipart: %s' % boundary.decode()) + raise MultiPartParserError('Invalid boundary in multipart: %s' % force_str(boundary)) # Content-Length should contain the length of the body we are about # to receive. diff --git a/tests/requests/tests.py b/tests/requests/tests.py index 9391ca2a08..945d77ff6e 100644 --- a/tests/requests/tests.py +++ b/tests/requests/tests.py @@ -5,6 +5,7 @@ from urllib.parse import urlencode from django.core.exceptions import DisallowedHost from django.core.handlers.wsgi import LimitedStream, WSGIRequest from django.http import HttpRequest, RawPostDataException, UnreadablePostError +from django.http.multipartparser import MultiPartParserError from django.http.request import HttpHeaders, split_domain_port from django.test import RequestFactory, SimpleTestCase, override_settings from django.test.client import FakePayload @@ -476,6 +477,16 @@ class RequestsTests(SimpleTestCase): }) self.assertFalse(request.POST._mutable) + def test_multipart_without_boundary(self): + request = WSGIRequest({ + 'REQUEST_METHOD': 'POST', + 'CONTENT_TYPE': 'multipart/form-data;', + 'CONTENT_LENGTH': 0, + 'wsgi.input': FakePayload(), + }) + with self.assertRaisesMessage(MultiPartParserError, 'Invalid boundary in multipart: None'): + request.POST + def test_POST_connection_error(self): """ If wsgi.input.read() raises an exception while trying to read() the