__all__ = ["wsgiwrap", "restart", "cookie", "formdata"]
import proto
-from util import wsgiwrap, formparams, persession, sessiondata, autodirty, manudirty, specdirty
+from util import wsgiwrap, formparams, funplex, persession, sessiondata, autodirty, manudirty, specdirty
from dispatch import restart
import cookie
from form import formdata
def wraphandler(handler, excinfo):
def wrapped(req):
return handler(req, excinfo)
+ wrapped.__wrapped__ = handler
return wrapped
errorhandler = env.var(defaulterror)
self.detail = detail
def handle(self, req):
- return skelfor(req).error(req, self.message, *self.detail)
+ return skelfor(req).message(req, self.message, *self.detail)
class httperror(usererror):
def __init__(self, status, message = None, detail = None):
req.ohead["Location"] = proto.appendurl(proto.requrl(req), self.url)
req.ohead["Content-Length"] = 0
return []
+
+class unmodified(dispatch.restart):
+ def handle(self, req):
+ req.status(304, "Not Modified")
+ req.ohead["Content-Length"] = "0"
+ return []
+import StringIO
+from wrw import dispatch
import cons
def findnsnames(el):
def fragment(cls, out, el, *args, **kw):
cls(out=out, root=el, *args, **kw).node(el)
+ @classmethod
+ def format(cls, el, *args, **kw):
+ buf = StringIO.StringIO()
+ cls.output(buf, el, *args, **kw)
+ return buf.getvalue()
+
def update(self, **ch):
ret = type(self).__new__(type(self))
ret.__dict__.update(self.__dict__)
def start(self):
super(indenter, self).start()
self.write('\n')
+
+class response(dispatch.restart):
+ charset = "utf-8"
+ doctype = None
+ formatter = indenter
+
+ def __init__(self, root):
+ super(response, self).__init__()
+ self.root = root
+
+ @property
+ def ctype(self):
+ raise Exception("a subclass of wrw.sp.util.response must override ctype")
+
+ def handle(self, req):
+ req.ohead["Content-Type"] = self.ctype
+ return [self.formatter.format(self.root, doctype=self.doctype, charset=self.charset)]
def xhtmlresp(callable):
def wrapper(req):
return forreq(req, callable(req))
+ wrapper.__wrapped__ = callable
return wrapper
-import inspect
-import req, dispatch, session, form, resp
+import inspect, math
+import req, dispatch, session, form, resp, proto
def wsgiwrap(callable):
def wrapper(env, startreq):
return dispatch.handleenv(env, startreq, callable)
+ wrapper.__wrapped__ = callable
return wrapper
def formparams(callable):
if spec.args[i] not in args:
raise resp.httperror(400, "Missing parameter", ("The query parameter `", resp.h.code(spec.args[i]), "' is required but not supplied."))
return callable(**args)
+ wrapper.__wrapped__ = callable
return wrapper
+class funplex(object):
+ def __init__(self, *funs, **nfuns):
+ self.dir = {}
+ self.dir.update(((self.unwrap(fun).__name__, fun) for fun in funs))
+ self.dir.update(nfuns)
+
+ @staticmethod
+ def unwrap(fun):
+ while hasattr(fun, "__wrapped__"):
+ fun = fun.__wrapped__
+ return fun
+
+ def __call__(self, req):
+ if req.pathinfo == "":
+ raise resp.redirect(req.uriname + "/")
+ if req.pathinfo[:1] != "/":
+ raise resp.notfound()
+ p = req.pathinfo[1:]
+ if p == "":
+ p = "__index__"
+ bi = 1
+ else:
+ p = p.partition("/")[0]
+ bi = len(p) + 1
+ if p in self.dir:
+ return self.dir[p](req.shift(bi))
+ raise resp.notfound()
+
+ def add(self, fun):
+ self.dir[self.unwrap(fun).__name__] = fun
+ return fun
+
+ def name(self, name):
+ def dec(fun):
+ self.dir[name] = fun
+ return fun
+ return dec
+
def persession(data = None):
def dec(callable):
def wrapper(req):
sess[data] = data()
sess[callable] = callable(data)
return sess[callable].handle(req)
+ wrapper.__wrapped__ = callable
return wrapper
return dec
def pregen(callable):
def wrapper(*args, **kwargs):
return preiter(callable(*args, **kwargs))
+ wrapper.__wrapped__ = callable
return wrapper
class sessiondata(object):
ss[i] = specslot.unbound
else:
ss[i] = val
+
+def datecheck(req, mtime):
+ if "If-Modified-Since" in req.ihead:
+ rtime = proto.phttpdate(req.ihead["If-Modified-Since"])
+ if rtime >= math.floor(mtime):
+ raise resp.unmodified()
+ req.ohead["Last-Modified"] = proto.httpdate(mtime)