Fixed #19101 -- Decoding of non-ASCII POST data on Python 3.

Thanks Claude Paroz.
This commit is contained in:
Aymeric Augustin 2012-11-03 12:54:06 +01:00
parent ac2052ebc8
commit 095eca8dd8
3 changed files with 15 additions and 2 deletions

View File

@ -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.

View File

@ -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):

View File

@ -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.