Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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

Thanks Claude Paroz.
  • Loading branch information...
commit 095eca8dd85cb27ed0b22829903df10f19cdab6c 1 parent ac2052e
@aaugustin aaugustin authored
View
2  django/http/multipartparser.py
@@ -110,7 +110,7 @@ def parse(self):
# HTTP spec says that Content-Length >= 0 is valid
# handling content-length == 0 before continuing
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.
# This allows overriding everything if somebody wants it.
View
3  django/http/request.py
@@ -276,6 +276,9 @@ def __init__(self, query_string, mutable=False, encoding=None):
encoding = settings.DEFAULT_CHARSET
self.encoding = encoding
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 '',
keep_blank_values=True,
encoding=encoding):
View
12 tests/regressiontests/requests/tests.py
@@ -12,7 +12,7 @@
from django.test.client import FakePayload
from django.test.utils import override_settings, str_prefix
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
@@ -353,6 +353,16 @@ def test_value_after_read(self):
self.assertRaises(Exception, lambda: request.body)
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):
"""
Test a POST with non-utf-8 payload encoding.
Please sign in to comment.
Something went wrong with that request. Please try again.