+import time, calendar
+
statusinfo = {
400: ("Bad Request", "Invalid HTTP request."),
401: ("Unauthorized", "Authentication must be provided for the requested resource."),
return None
tz = int(tz[1:])
tz = (((tz / 100) * 60) + (tz % 100)) * 60
- return time.mktime(time.strptime(dstr, "%a, %d %b %Y %H:%M:%S")) - tz - time.altzone
+ return calendar.timegm(time.strptime(dstr, "%a, %d %b %Y %H:%M:%S")) - tz
def pmimehead(hstr):
def pws(p):
ret += c
return ret
+def simpleerror(env, startreq, code, title, msg):
+ buf = """<?xml version="1.0" encoding="US-ASCII"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+<head>
+<title>%s</title>
+</head>
+<body>
+<h1>%s</h1>
+<p>%s</p>
+</body>
+</html>
+""" % (title, title, htmlq(msg))
+ buf = buf.encode("us-ascii")
+ startreq("%i %s" % (code, title), [("Content-Type", "text/html"), ("Content-Length", str(len(buf)))])
+ return [buf]
+
def urlq(url):
+ if isinstance(url, str):
+ url = url.encode("utf-8")
ret = ""
+ invalid = b"%;&=#?/\"'"
for c in url:
- if c == "&" or c == "=" or c == "#" or c == "?" or c == "/" or (ord(c) <= 32):
- ret += "%%%02X" % ord(c)
+ if c in invalid or (c <= 32) or (c >= 128):
+ ret += "%%%02X" % c
else:
- ret += c
+ ret += chr(c)
return ret
class urlerror(ValueError):
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)
p = local.rfind('/')
return consurl(proto, host, local[:p + 1] + other)
-def requrl(req):
+def siteurl(req):
host = req.ihead.get("Host", None)
if host is None:
raise Exception("Could not reconstruct URL because no Host header was sent")
proto = "http"
if req.https:
proto = "https"
+ return "%s://%s/" % (proto, host)
+
+def scripturl(req):
+ s = siteurl(req)
+ if req.uriname[0] != '/':
+ raise Exception("Malformed local part when reconstructing URL")
+ return siteurl(req) + req.uriname[1:]
+
+def requrl(req):
+ s = siteurl(req)
if req.uri[0] != '/':
raise Exception("Malformed local part when reconstructing URL")
- return "%s://%s%s" % (proto, host, req.uri)
+ return siteurl(req) + req.uri[1:]
-def parstring(pars = {}, **augment):
+def parstring(pars={}, **augment):
buf = ""
for key in pars:
if key in augment:
buf += urlq(key) + "=" + urlq(str(augment[key]))
return buf
-def parurl(url, pars = {}, **augment):
+def parurl(url, pars={}, **augment):
qs = parstring(pars, **augment)
if qs != "":
return url + "?" + qs