Skip to content

Commit

Permalink
Add max_age parameter to save_cookie
Browse files Browse the repository at this point in the history
  • Loading branch information
asvetlov committed Nov 30, 2015
1 parent efd2d38 commit 471da60
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 9 deletions.
9 changes: 6 additions & 3 deletions aiohttp_session/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ def __init__(self, identity, *, data, new):
self._mapping = {}
self._identity = identity
self._new = new
self._max_age = None
created = data.get('created', None) if data else None
session_data = data.get('session', None) if data else None

Expand Down Expand Up @@ -198,12 +199,14 @@ def load_cookie(self, request):
cookie = request.cookies.get(self._cookie_name)
return cookie

def save_cookie(self, response, cookie_data):
def save_cookie(self, response, cookie_data, *, max_age=None):
params = dict(self._cookie_params)
if max_age is not None:
params['max_age'] = max_age
if not cookie_data:
response.del_cookie(self._cookie_name)
else:
response.set_cookie(self._cookie_name, cookie_data,
**self._cookie_params)
response.set_cookie(self._cookie_name, cookie_data, **params)


class SimpleCookieStorage(AbstractStorage):
Expand Down
4 changes: 3 additions & 1 deletion aiohttp_session/cookie_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,14 @@ def load_session(self, request):
@asyncio.coroutine
def save_session(self, request, response, session):
if session.empty:
return self.save_cookie(response, session._mapping)
return self.save_cookie(response, session._mapping,
max_age=session.max_age)

cookie_data = json.dumps(
self._get_session_data(session)
).encode('utf-8')
self.save_cookie(
response,
self._fernet.encrypt(cookie_data).decode('utf-8'),
max_age=session.max_age
)
6 changes: 4 additions & 2 deletions aiohttp_session/nacl_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ def load_session(self, request):
@asyncio.coroutine
def save_session(self, request, response, session):
if session.empty:
return self.save_cookie(response, session._mapping)
return self.save_cookie(response, session._mapping,
max_age=session.max_age)

cookie_data = json.dumps(
self._get_session_data(session)
Expand All @@ -45,5 +46,6 @@ def save_session(self, request, response, session):
self.save_cookie(
response,
self._secretbox.encrypt(cookie_data, nonce,
encoder=Base64Encoder).decode('utf-8')
encoder=Base64Encoder).decode('utf-8'),
max_age=session.max_age
)
6 changes: 4 additions & 2 deletions aiohttp_session/redis_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,12 @@ def save_session(self, request, response, session):
key = session.identity
if key is None:
key = uuid.uuid4().hex
self.save_cookie(response, key)
self.save_cookie(response, key,
max_age=session.max_age)
else:
key = str(key)
self.save_cookie(response, key)
self.save_cookie(response, key,
max_age=session.max_age)

data = self._encoder(self._get_session_data(session))
with (yield from self._redis) as conn:
Expand Down
5 changes: 4 additions & 1 deletion docs/reference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -202,11 +202,14 @@ implement both :meth:`~AbstractStorage.load_session` and
A helper for loading cookie (:class:`http.cookies.SimpleCookie`
instance) from *request* (:class:`aiohttp.web.Request`).

.. method:: save_cookie(response, cookie_data)
.. method:: save_cookie(response, cookie_data, *, max_age=None)

A helper for saving *cookie_data* (:class:`str`) into *response*
(:class:`aiohttp.web.StreamResponse` or descendants).

*max_age* is cookie lifetime given from session. Storage defailt
is used if the value is ``None``.


Simple Storage
--------------
Expand Down

0 comments on commit 471da60

Please sign in to comment.