Changed some whitespace usage.
[wrw.git] / wrw / proto.py
index 6b43396..3d8b96e 100644 (file)
@@ -1,8 +1,12 @@
 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 +21,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 +113,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 +142,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 +156,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