Fixed #19101 -- Decoding of non-ASCII POST data on Python 3.
Thanks Claude Paroz.
This commit is contained in:
parent
ac2052ebc8
commit
095eca8dd8
|
@ -110,7 +110,7 @@ class MultiPartParser(object):
|
||||||
# HTTP spec says that Content-Length >= 0 is valid
|
# HTTP spec says that Content-Length >= 0 is valid
|
||||||
# handling content-length == 0 before continuing
|
# handling content-length == 0 before continuing
|
||||||
if self._content_length == 0:
|
if self._content_length == 0:
|
||||||
return QueryDict(MultiValueDict(), encoding=self._encoding), MultiValueDict()
|
return QueryDict('', encoding=self._encoding), MultiValueDict()
|
||||||
|
|
||||||
# See if the handler will want to take care of the parsing.
|
# See if the handler will want to take care of the parsing.
|
||||||
# This allows overriding everything if somebody wants it.
|
# This allows overriding everything if somebody wants it.
|
||||||
|
|
|
@ -276,6 +276,9 @@ class QueryDict(MultiValueDict):
|
||||||
encoding = settings.DEFAULT_CHARSET
|
encoding = settings.DEFAULT_CHARSET
|
||||||
self.encoding = encoding
|
self.encoding = encoding
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
|
if isinstance(query_string, bytes):
|
||||||
|
# query_string contains URL-encoded data, a subset of ASCII.
|
||||||
|
query_string = query_string.decode()
|
||||||
for key, value in parse_qsl(query_string or '',
|
for key, value in parse_qsl(query_string or '',
|
||||||
keep_blank_values=True,
|
keep_blank_values=True,
|
||||||
encoding=encoding):
|
encoding=encoding):
|
||||||
|
|
|
@ -12,7 +12,7 @@ from django.http import HttpRequest, HttpResponse, parse_cookie, build_request_r
|
||||||
from django.test.client import FakePayload
|
from django.test.client import FakePayload
|
||||||
from django.test.utils import override_settings, str_prefix
|
from django.test.utils import override_settings, str_prefix
|
||||||
from django.utils import unittest
|
from django.utils import unittest
|
||||||
from django.utils.http import cookie_date
|
from django.utils.http import cookie_date, urlencode
|
||||||
from django.utils.timezone import utc
|
from django.utils.timezone import utc
|
||||||
|
|
||||||
|
|
||||||
|
@ -353,6 +353,16 @@ class RequestsTests(unittest.TestCase):
|
||||||
self.assertRaises(Exception, lambda: request.body)
|
self.assertRaises(Exception, lambda: request.body)
|
||||||
self.assertEqual(request.POST, {})
|
self.assertEqual(request.POST, {})
|
||||||
|
|
||||||
|
def test_non_ascii_POST(self):
|
||||||
|
payload = FakePayload(urlencode({'key': 'España'}))
|
||||||
|
request = WSGIRequest({
|
||||||
|
'REQUEST_METHOD': 'POST',
|
||||||
|
'CONTENT_LENGTH': len(payload),
|
||||||
|
'CONTENT_TYPE': 'application/x-www-form-urlencoded',
|
||||||
|
'wsgi.input': payload,
|
||||||
|
})
|
||||||
|
self.assertEqual(request.POST, {'key': ['España']})
|
||||||
|
|
||||||
def test_alternate_charset_POST(self):
|
def test_alternate_charset_POST(self):
|
||||||
"""
|
"""
|
||||||
Test a POST with non-utf-8 payload encoding.
|
Test a POST with non-utf-8 payload encoding.
|
||||||
|
|
Loading…
Reference in New Issue