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