request: only preprocess form fields in py2 (#36515)

This commit is contained in:
Frédéric Péters 2019-11-12 14:17:29 +01:00
parent b73c5cc666
commit 07357b8549
2 changed files with 28 additions and 17 deletions

View File

@ -117,23 +117,32 @@ class CompatHTTPRequest(HTTPRequest):
if not self.form:
self.form = {}
for k in self.django_request.POST:
v = self.django_request.POST[k]
if k.endswith('[]'):
v = [x.encode(site_charset) for x in self.django_request.POST.getlist(k)]
else:
v = self.django_request.POST[k]
if isinstance(v, unicode):
v = v.encode(site_charset)
if isinstance(k, unicode):
k = k.encode(site_charset)
v = [x for x in self.django_request.POST.getlist(k)]
if six.PY2:
if k.endswith('[]'):
v = [x.encode(site_charset) for x in v]
else:
v = self.django_request.POST[k]
if isinstance(v, unicode):
v = v.encode(site_charset)
if isinstance(k, unicode):
k = k.encode(site_charset)
self.form[k] = v
for k, upload_file in self.django_request.FILES.items():
upload = Upload(upload_file.name.encode('utf-8'),
upload_file.content_type.encode('utf-8'),
upload_file.charset)
if six.PY2:
upload = Upload(upload_file.name.encode('utf-8'),
upload_file.content_type.encode('utf-8'),
upload_file.charset)
if isinstance(k, unicode):
k = k.encode(site_charset)
else:
upload = Upload(upload_file.name,
upload_file.content_type,
upload_file.charset)
upload.fp = upload_file.file
if isinstance(k, unicode):
k = k.encode(site_charset)
self.form[k] = upload
def build_absolute_uri(self):

View File

@ -19,6 +19,7 @@ import copy
import re
import time
from django.utils import six
from quixote import get_session, get_publisher
import quixote.http_request
from quixote.errors import RequestError
@ -130,11 +131,12 @@ class HTTPRequest(quixote.http_request.HTTPRequest):
self._json = json_loads(payload)
except ValueError as e:
raise RequestError('invalid json payload (%s)' % str(e))
# Make sure request.form doesn't contain unicode strings, converting
# them all to strings encoded in the site charset.
self.form = dict(
(str(k), v.encode(self.charset) if isinstance(v, unicode) else v)
for k, v in self.form.items())
if six.PY2:
# Make sure request.form doesn't contain unicode strings, converting
# them all to strings encoded in the site charset.
self.form = dict(
(str(k), v.encode(self.charset) if isinstance(v, unicode) else v)
for k, v in self.form.items())
# remove characters that are not valid XML so it doesn't have to happen
# down the chain.
illegal_xml_chars = re.compile(u'[\x00-\x08\x0b\x0c\x0e-\x1f\ud800-\udfff\ufffe\uffff]')