029e6928c9c2f1f8c092ff5df84e405e128a8362
[wrw.git] / wrw / cookie.py
1 import http.cookies, time
2 from . import proto
3
4 __all__ = ["cookies", "get", "add"]
5
6 def addcookies(req):
7     ck = cookies(req)
8     for nm in ck.codec:
9         req.ohead.add("Set-Cookie", ck.codec[nm].OutputString())
10
11 class cookiedict(object):
12     def __init__(self, req):
13         try:
14             self.bk = http.cookies.SimpleCookie(req.ihead.get("Cookie"))
15         except http.cookies.CookieError:
16             self.bk = http.cookies.SimpleCookie()
17         self.codec = http.cookies.SimpleCookie()
18         req.oncommit(addcookies)
19
20     def __getitem__(self, name):
21         return self.bk[name].value
22
23     def __contains__(self, name):
24         return name in self.bk
25
26     def get(self, name, default=None):
27         if name not in self.bk:
28             return default
29         return self.bk[name].value
30
31     def add(self, name, value, **kw):
32         self.codec[name] = value
33         for key, value in kw.items():
34             if key == "maxage":
35                 key = "max-age"
36             self.codec[name][key] = value
37
38     def __setitem__(self, name, value):
39         self.add(name, value)
40
41 def cookies(req):
42     return req.item(cookiedict)
43
44 def get(req, name, default=None):
45     return cookies(req).get(name, default)
46
47 def add(req, name, value, **kw):
48     cookies(req).add(name, value, **kw)
49
50 cdate = proto.httpdate