python: Initial porting of the Python code to Python 3.
[ashd.git] / python / ashd / util.py
index 0ff3878..08945f2 100644 (file)
@@ -4,8 +4,8 @@ This module implements a rather convenient interface for writing ashd
 handlers, wrapping the low-level ashd.proto module.
 """
 
-import os, socket
-import proto
+import os, socket, collections
+from . import proto
 
 __all__ = ["stdfork", "pchild", "respond", "serveloop"]
 
@@ -27,7 +27,7 @@ def stdfork(argv, chinit = None):
     if pid == 0:
         try:
             os.dup2(csk.fileno(), 0)
-            for fd in xrange(3, 1024):
+            for fd in range(3, 1024):
                 try:
                     os.close(fd)
                 except:
@@ -131,17 +131,20 @@ def respond(req, body, status = ("200 OK"), ctype = "text/html"):
     For example:
         respond(req, "Not found", status = "404 Not Found", ctype = "text/plain")
     """
-    if type(body) == unicode:
-        body = body.decode("utf-8")
-        if ctype[:5] == "text/" and ctype.find(';') < 0:
-            ctype = ctype + "; charset=utf-8"
+    if isinstance(body, collections.ByteString):
+        body = bytes(body)
     else:
         body = str(body)
+        body = body.encode("utf-8")
+        if ctype[:5] == "text/" and ctype.find(';') < 0:
+            ctype = ctype + "; charset=utf-8"
     try:
-        req.sk.write("HTTP/1.1 %s\n" % status)
-        req.sk.write("Content-Type: %s\n" % ctype)
-        req.sk.write("Content-Length: %i\n" % len(body))
-        req.sk.write("\n")
+        head = ""
+        head += "HTTP/1.1 %s\n" % status
+        head += "Content-Type: %s\n" % ctype
+        head += "Content-Length: %i\n" % len(body)
+        head += "\n"
+        req.sk.write(head.encode("ascii"))
         req.sk.write(body)
     finally:
         req.close()