From 0d23450e81dc355c354a873fe187687e4aaa4886 Mon Sep 17 00:00:00 2001
From: qingfeng <qingfenghello@gmail.com>
Date: Sat, 2 Aug 2014 00:29:59 +0800
Subject: [PATCH] Fixed #19802 -- Fixed HttpResponse.set_cookie() with unicode
 data on Python 2.

Thanks django at patrickbregman.eu for the report.
---
 django/http/response.py | 3 ++-
 tests/requests/tests.py | 8 ++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/django/http/response.py b/django/http/response.py
index b3f44cdf92..866b3480e7 100644
--- a/django/http/response.py
+++ b/django/http/response.py
@@ -13,7 +13,7 @@ from django.core.exceptions import DisallowedRedirect
 from django.core.serializers.json import DjangoJSONEncoder
 from django.http.cookie import SimpleCookie
 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.six.moves import map
 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.
 
         """
+        value = force_str(value)
         self.cookies[key] = value
         if expires is not None:
             if isinstance(expires, datetime.datetime):
diff --git a/tests/requests/tests.py b/tests/requests/tests.py
index 1eea1be439..b8291d8359 100644
--- a/tests/requests/tests.py
+++ b/tests/requests/tests.py
@@ -14,6 +14,7 @@ from django.test import SimpleTestCase, RequestFactory, override_settings
 from django.test.client import FakePayload
 from django.test.utils import str_prefix
 from django.utils import six
+from django.utils.encoding import force_str
 from django.utils.http import cookie_date, urlencode
 from django.utils.six.moves.urllib.parse import urlencode as original_urlencode
 from django.utils.timezone import utc
@@ -193,6 +194,13 @@ class RequestsTests(SimpleTestCase):
         self.assertTrue('; httponly' in str(example_cookie))
         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):
         # Read all of a limited stream
         stream = LimitedStream(BytesIO(b'test'), 2)