python: Use new-style classes in ashd.wsgidir.
[ashd.git] / python / ashd-wsgi
index 7462492..79aad4f 100755 (executable)
@@ -36,6 +36,10 @@ else:
         sys.exit(1)
     handler = handlermod.application
 
+class closed(IOError):
+    def __init__(self):
+        super(closed, self).__init__("The client has closed the connection.")
+
 cwd = os.getcwd()
 def absolutify(path):
     if path[0] != '/':
@@ -49,22 +53,22 @@ def unquoteurl(url):
         c = url[i]
         i += 1
         if c == '%':
-            if len(url) > i + 2:
+            if len(url) >= i + 2:
                 c = 0
                 if '0' <= url[i] <= '9':
                     c |= (ord(url[i]) - ord('0')) << 4
                 elif 'a' <= url[i] <= 'f':
-                    c |= (ord(url[i]) - ord('a')) << 4
+                    c |= (ord(url[i]) - ord('a') + 10) << 4
                 elif 'A' <= url[i] <= 'F':
-                    c |= (ord(url[i]) - ord('A')) << 4
+                    c |= (ord(url[i]) - ord('A') + 10) << 4
                 else:
                     raise ValueError("Illegal URL escape character")
                 if '0' <= url[i + 1] <= '9':
                     c |= ord(url[i + 1]) - ord('0')
                 elif 'a' <= url[i + 1] <= 'f':
-                    c |= ord(url[i + 1]) - ord('a')
+                    c |= ord(url[i + 1]) - ord('a') + 10
                 elif 'A' <= url[i + 1] <= 'F':
-                    c |= ord(url[i + 1]) - ord('A')
+                    c |= ord(url[i + 1]) - ord('A') + 10
                 else:
                     raise ValueError("Illegal URL escape character")
                 buf += chr(c)
@@ -122,17 +126,23 @@ def dowsgi(req):
                 raise Exception, "Trying to write data before starting response."
             status, headers = resp
             respsent[:] = [True]
-            req.sk.write("HTTP/1.1 %s\n" % status)
-            for nm, val in headers:
-                req.sk.write("%s: %s\n" % (nm, val))
-            req.sk.write("\n")
+            try:
+                req.sk.write("HTTP/1.1 %s\n" % status)
+                for nm, val in headers:
+                    req.sk.write("%s: %s\n" % (nm, val))
+                req.sk.write("\n")
+            except IOError:
+                raise closed()
 
     def write(data):
         if not data:
             return
         flushreq()
-        req.sk.write(data)
-        req.sk.flush()
+        try:
+            req.sk.write(data)
+            req.sk.flush()
+        except IOError:
+            raise closed()
 
     def startreq(status, headers, exc_info = None):
         if resp:
@@ -149,10 +159,13 @@ def dowsgi(req):
 
     respiter = handler(env, startreq)
     try:
-        for data in respiter:
-            write(data)
-        if resp:
-            flushreq()
+        try:
+            for data in respiter:
+                write(data)
+            if resp:
+                flushreq()
+        except closed:
+            pass
     finally:
         if hasattr(respiter, "close"):
             respiter.close()