def save(cookies): now = int(time()) // 60 ctime_str = '%x' % local.ctime mtime_str = '%x' % now if local.user is not None or local.session: if local.user and local.longlife_session: if not local.longlife_key: set_longlife_session() longlife_key = local.longlife_key or '' else: longlife_key = '' info = local.user, local.session.__dict__ data = dumps(info) if storage is False: data = 'C' + data # "C" stands for "C"ookies-only else: session_id = storage.put(data, local.ctime, now, local.session_id) if session_id is None: session_id = '' # What is the best way to handle storage errors? elif local.session_id is not None: assert session_id == local.session_id data = 'S' + session_id # "S" stands for "S"torage hashobject = get_hashobject(now) hashobject.update(ctime_str) hashobject.update(data) hashobject.update(local.user_agent or '') if local.remember_ip: hashobject.update(local.ip or '') data_str = b64encode(data) hash_str = b64encode(hashobject.digest()) cookie_value = ':'.join([ ctime_str, mtime_str, data_str, hash_str, longlife_key ]) else: cookie_value = '' if storage and local.session_id: storage.delete(local.session_id) if cookie_value != local.cookie_value: max_time = (options.MAX_LONGLIFE_SESSION+1)*24*60*60 httputils.set_cookie(cookies, options.COOKIE_NAME, cookie_value, max_time, max_time, options.COOKIE_PATH, options.COOKIE_DOMAIN, http_only=True)
def set_cookie(name, value, expires=None, max_age=None, path=None, domain=None, secure=False, http_only=False, comment=None, version=None): httputils.set_cookie(local.response.cookies, name, value, expires, max_age, path, domain, secure, http_only, comment, version)