Skip to content

Commit 2cb70cc

Browse files
committed
Fix #967: large cookie expiration/max-age doesn't break an event loop from now
1 parent e65d3f8 commit 2cb70cc

File tree

3 files changed

+27
-11
lines changed

3 files changed

+27
-11
lines changed

CHANGES.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
CHANGES
22
=======
33

4+
0.22.1 (08-16-2016)
5+
-------------------
6+
7+
- Large cookie expiration/max-age doesn't break an event loop from now
8+
(fixes #967)
9+
10+
411
0.22.0 (08-15-2016)
512
-------------------
613

aiohttp/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This relies on each of the submodules having an __all__ variable.
22

3-
__version__ = '0.22.0'
3+
__version__ = '0.22.1'
44

55
import multidict # noqa
66

aiohttp/helpers.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
import io
99
import os
1010
import re
11-
from urllib.parse import quote, urlencode, urlsplit
12-
from http.cookies import SimpleCookie, Morsel
11+
1312
from collections import namedtuple
13+
from http.cookies import SimpleCookie, Morsel
14+
from math import ceil
1415
from pathlib import Path
16+
from urllib.parse import quote, urlencode, urlsplit
1517

1618
import multidict
1719

@@ -589,9 +591,17 @@ def __init__(self, *, loop=None):
589591
super().__init__(loop=loop)
590592
self._host_only_cookies = set()
591593

592-
def _expire_cookie(self, name):
593-
if name in self._cookies:
594-
del self._cookies[name]
594+
def _expire_cookie(self, when, name, DAY=24*3600):
595+
now = self._loop.time()
596+
delta = when - now
597+
if delta <= 0:
598+
# expired
599+
self._cookies.pop(name, None)
600+
if delta > DAY:
601+
# Huge timeouts (more than 24 days) breaks event loop
602+
self._loop.call_at(ceil(now+DAY), self._expire_cookie, when, name)
603+
else:
604+
self._loop.call_at(ceil(when), self._expire_cookie, when, name)
595605

596606
def update_cookies(self, cookies, response_url=None):
597607
"""Update cookies."""
@@ -636,18 +646,17 @@ def update_cookies(self, cookies, response_url=None):
636646
if max_age:
637647
try:
638648
delta_seconds = int(max_age)
639-
self._loop.call_later(
640-
delta_seconds, self._expire_cookie, name)
649+
self._expire_cookie(self._loop.time() + delta_seconds,
650+
name)
641651
except ValueError:
642652
cookie["max-age"] = ""
643653

644654
expires = cookie["expires"]
645655
if not cookie["max-age"] and expires:
646656
expire_time = self._parse_date(expires)
647657
if expire_time:
648-
self._loop.call_at(
649-
expire_time.timestamp(),
650-
self._expire_cookie, name)
658+
self._expire_cookie(expire_time.timestamp(),
659+
name)
651660
else:
652661
cookie["expires"] = ""
653662

0 commit comments

Comments
 (0)