X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=wrw%2Fproto.py;h=b1f0ab375e6faba741cc1dc4da86d85ba3950e0c;hb=7be9e8bb560cd4e969992759bbcb523b40e544af;hp=6b433961915082fa5d8e0668c6ec35ca266cf00f;hpb=bb80acbd0ceb6333da8a1cace1655968b9f17403;p=wrw.git diff --git a/wrw/proto.py b/wrw/proto.py index 6b43396..b1f0ab3 100644 --- a/wrw/proto.py +++ b/wrw/proto.py @@ -1,8 +1,14 @@ +import time + statusinfo = { - 400: ("Bad Request", "Your issued HTTP request is invalid."), - 403: ("Forbidden", "You are not authorized to view the requested resource."), + 400: ("Bad Request", "Invalid HTTP request."), + 401: ("Unauthorized", "Authentication must be provided for the requested resource."), + 403: ("Forbidden", "You are not authorized to request the requested resource."), 404: ("Not Found", "The requested resource was not found."), - 500: ("Server Error", "An internal error occurred.") + 405: ("Method Not Allowed", "The request method is not recognized or permitted by the requested resource."), + 500: ("Server Error", "An internal error occurred."), + 501: ("Not Implemented", "The requested functionality has not been implemented."), + 503: ("Service Unavailable", "Service is being denied at this time."), } def httpdate(ts): @@ -17,6 +23,55 @@ def phttpdate(dstr): tz = (((tz / 100) * 60) + (tz % 100)) * 60 return time.mktime(time.strptime(dstr, "%a, %d %b %Y %H:%M:%S")) - tz - time.altzone +def pmimehead(hstr): + def pws(p): + while p < len(hstr) and hstr[p].isspace(): + p += 1 + return p + def token(p, sep): + buf = "" + p = pws(p) + if p >= len(hstr): + return "", p + if hstr[p] == '"': + p += 1 + while p < len(hstr): + if hstr[p] == '\\': + p += 1 + if p < len(hstr): + buf += hstr[p] + p += 1 + else: + break + elif hstr[p] == '"': + p += 1 + break + else: + buf += hstr[p] + p += 1 + return buf, pws(p) + else: + while p < len(hstr): + if hstr[p] in sep: + break + buf += hstr[p] + p += 1 + return buf.strip(), pws(p) + p = 0 + val, p = token(p, ";") + pars = {} + while p < len(hstr): + if hstr[p] != ';': + break + p += 1 + k, p = token(p, "=") + if k == "" or hstr[p:p + 1] != '=': + break + p += 1 + v, p = token(p, ';') + pars[k.lower()] = v + return val, pars + def htmlq(html): ret = "" for c in html: @@ -60,7 +115,7 @@ def parseurl(url): local = local[:q] return proto, host, local, query -def consurl(proto, host, local, query = ""): +def consurl(proto, host, local, query=""): if len(local) < 1 and local[0] != '/': raise urlerror("Local part of URL must begin with a slash") ret = "%s://%s%s" % (proto, host, local) @@ -89,7 +144,7 @@ def requrl(req): raise Exception("Malformed local part when reconstructing URL") return "%s://%s%s" % (proto, host, req.uri) -def parstring(pars = {}, **augment): +def parstring(pars={}, **augment): buf = "" for key in pars: if key in augment: @@ -103,3 +158,10 @@ def parstring(pars = {}, **augment): if buf != "": buf += "&" buf += urlq(key) + "=" + urlq(str(augment[key])) return buf + +def parurl(url, pars={}, **augment): + qs = parstring(pars, **augment) + if qs != "": + return url + "?" + qs + else: + return url