Commit | Line | Data |
---|---|---|
4e7888f7 FT |
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() |