| 1 | import os, socket |
| 2 | import proto |
| 3 | |
| 4 | def stdfork(argv, chinit = None): |
| 5 | csk, psk = socket.socketpair(socket.AF_UNIX, socket.SOCK_SEQPACKET) |
| 6 | pid = os.fork() |
| 7 | if pid == 0: |
| 8 | try: |
| 9 | os.dup2(csk.fileno(), 0) |
| 10 | for fd in xrange(3, 1024): |
| 11 | try: |
| 12 | os.close(fd) |
| 13 | except: |
| 14 | pass |
| 15 | if chinit is not None: |
| 16 | chinit() |
| 17 | os.execvp(argv[0], argv) |
| 18 | finally: |
| 19 | os._exit(127) |
| 20 | csk.close() |
| 21 | fd = os.dup(psk.fileno()) |
| 22 | psk.close() |
| 23 | return fd |
| 24 | |
| 25 | def respond(req, body, status = ("200 OK"), ctype = "text/html"): |
| 26 | if type(body) == unicode: |
| 27 | body = body.decode("utf-8") |
| 28 | if ctype[:5] == "text/" and ctype.find(';') < 0: |
| 29 | ctype = ctype + "; charset=utf-8" |
| 30 | else: |
| 31 | body = str(body) |
| 32 | try: |
| 33 | req.sk.write("HTTP/1.1 %s\n" % status) |
| 34 | req.sk.write("Content-Type: %s\n" % ctype) |
| 35 | req.sk.write("Content-Length: %i\n" % len(body)) |
| 36 | req.sk.write("\n") |
| 37 | req.sk.write(body) |
| 38 | finally: |
| 39 | req.close() |
| 40 | |
| 41 | def serveloop(handler, sock = 0): |
| 42 | while True: |
| 43 | req = proto.recvreq(sock) |
| 44 | if req is None: |
| 45 | break |
| 46 | try: |
| 47 | handler(req) |
| 48 | finally: |
| 49 | req.close() |