Properly quote percent-signs in URLs.
[wrw.git] / wrw / proto.py
index 8474b3a..482a23e 100644 (file)
@@ -1,4 +1,4 @@
-import time
+import time, calendar
 
 statusinfo = {
     400: ("Bad Request", "Invalid HTTP request."),
@@ -21,7 +21,7 @@ def phttpdate(dstr):
         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):
@@ -85,13 +85,33 @@ def htmlq(html):
             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):