Fixed #19802 -- Fixed HttpResponse.set_cookie() with unicode data on Python 2.

Thanks django at patrickbregman.eu for the report.
This commit is contained in:
qingfeng 2014-08-02 00:29:59 +08:00 committed by Tim Graham
parent 0f2ceee025
commit 0d23450e81
2 changed files with 10 additions and 1 deletions

View File

@ -13,7 +13,7 @@ from django.core.exceptions import DisallowedRedirect
from django.core.serializers.json import DjangoJSONEncoder from django.core.serializers.json import DjangoJSONEncoder
from django.http.cookie import SimpleCookie from django.http.cookie import SimpleCookie
from django.utils import six, timezone from django.utils import six, timezone
from django.utils.encoding import force_bytes, force_text, iri_to_uri from django.utils.encoding import force_bytes, force_text, force_str, iri_to_uri
from django.utils.http import cookie_date from django.utils.http import cookie_date
from django.utils.six.moves import map from django.utils.six.moves import map
from django.utils.six.moves.urllib.parse import urlparse from django.utils.six.moves.urllib.parse import urlparse
@ -221,6 +221,7 @@ class HttpResponseBase(six.Iterator):
If it is a ``datetime.datetime`` object then ``max_age`` will be calculated. If it is a ``datetime.datetime`` object then ``max_age`` will be calculated.
""" """
value = force_str(value)
self.cookies[key] = value self.cookies[key] = value
if expires is not None: if expires is not None:
if isinstance(expires, datetime.datetime): if isinstance(expires, datetime.datetime):

View File

@ -14,6 +14,7 @@ from django.test import SimpleTestCase, RequestFactory, override_settings
from django.test.client import FakePayload from django.test.client import FakePayload
from django.test.utils import str_prefix from django.test.utils import str_prefix
from django.utils import six from django.utils import six
from django.utils.encoding import force_str
from django.utils.http import cookie_date, urlencode from django.utils.http import cookie_date, urlencode
from django.utils.six.moves.urllib.parse import urlencode as original_urlencode from django.utils.six.moves.urllib.parse import urlencode as original_urlencode
from django.utils.timezone import utc from django.utils.timezone import utc
@ -193,6 +194,13 @@ class RequestsTests(SimpleTestCase):
self.assertTrue('; httponly' in str(example_cookie)) self.assertTrue('; httponly' in str(example_cookie))
self.assertTrue(example_cookie['httponly']) self.assertTrue(example_cookie['httponly'])
def test_unicode_cookie(self):
"Verify HttpResponse.set_cookie() works with unicode data."
response = HttpResponse()
cookie_value = '清風'
response.set_cookie('test', cookie_value)
self.assertEqual(force_str(cookie_value), response.cookies['test'].value)
def test_limited_stream(self): def test_limited_stream(self):
# Read all of a limited stream # Read all of a limited stream
stream = LimitedStream(BytesIO(b'test'), 2) stream = LimitedStream(BytesIO(b'test'), 2)