Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #17931 -- Accepted aware datetimes to set cookies expiry dates.…

… Thanks jaddison for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17766 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit c8e2f7591d6ea3545aeb32fa4c92cbeb9a622546 1 parent c7cc4cf
@aaugustin aaugustin authored
Showing with 19 additions and 3 deletions.
  1. +9 −3 django/http/__init__.py
  2. +10 −0 tests/regressiontests/requests/tests.py
View
12 django/http/__init__.py
@@ -121,6 +121,7 @@ def __init__(self, *args, **kwargs):
from django.utils.datastructures import MultiValueDict, ImmutableList
from django.utils.encoding import smart_str, iri_to_uri, force_unicode
from django.utils.http import cookie_date
+from django.utils import timezone
RESERVED_CHARS="!*'();:@&=+$,/?%#[]"
@@ -641,13 +642,18 @@ def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
"""
Sets a cookie.
- ``expires`` can be a string in the correct format or a
- ``datetime.datetime`` object in UTC. If ``expires`` is a datetime
- object then ``max_age`` will be calculated.
+ ``expires`` can be:
+ - a string in the correct format,
+ - a naive ``datetime.datetime`` object in UTC,
+ - an aware ``datetime.datetime`` object in any time zone.
+ If it is a ``datetime.datetime`` object then ``max_age`` will be calculated.
+
"""
self.cookies[key] = value
if expires is not None:
if isinstance(expires, datetime.datetime):
+ if timezone.is_aware(expires):
+ expires = timezone.make_naive(expires, timezone.utc)
delta = expires - expires.utcnow()
# Add one second so the date matches exactly (a fraction of
# time gets lost between converting to a timedelta and
View
10 tests/regressiontests/requests/tests.py
@@ -12,6 +12,7 @@
from django.test.utils import get_warnings_state, restore_warnings_state
from django.utils import unittest
from django.utils.http import cookie_date
+from django.utils.timezone import utc
class RequestsTests(unittest.TestCase):
@@ -207,6 +208,15 @@ def test_near_expiration(self):
datetime_cookie = response.cookies['datetime']
self.assertEqual(datetime_cookie['max-age'], 10)
+ def test_aware_expiration(self):
+ "Cookie accepts an aware datetime as expiration time"
+ response = HttpResponse()
+ expires = (datetime.utcnow() + timedelta(seconds=10)).replace(tzinfo=utc)
+ time.sleep(0.001)
+ response.set_cookie('datetime', expires=expires)
+ datetime_cookie = response.cookies['datetime']
+ self.assertEqual(datetime_cookie['max-age'], 10)
+
def test_far_expiration(self):
"Cookie will expire when an distant expiration time is provided"
response = HttpResponse()
Please sign in to comment.
Something went wrong with that request. Please try again.