14 def __init__(self, inp=None, out=None, env=None): |
14 def __init__(self, inp=None, out=None, env=None): |
15 self.inp = inp or sys.stdin |
15 self.inp = inp or sys.stdin |
16 self.out = out or sys.stdout |
16 self.out = out or sys.stdout |
17 self.env = env or os.environ |
17 self.env = env or os.environ |
18 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) |
18 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) |
|
19 self.will_close = True |
19 |
20 |
20 def write(self, *things): |
21 def write(self, *things): |
21 for thing in things: |
22 for thing in things: |
22 if hasattr(thing, "__iter__"): |
23 if hasattr(thing, "__iter__"): |
23 for part in thing: |
24 for part in thing: |
27 self.out.write(str(thing)) |
28 self.out.write(str(thing)) |
28 except socket.error, inst: |
29 except socket.error, inst: |
29 if inst[0] != errno.ECONNRESET: |
30 if inst[0] != errno.ECONNRESET: |
30 raise |
31 raise |
31 |
32 |
|
33 def done(self): |
|
34 if self.will_close: |
|
35 self.inp.close() |
|
36 self.out.close() |
|
37 else: |
|
38 self.out.flush() |
|
39 |
32 def header(self, headers=[('Content-type','text/html')]): |
40 def header(self, headers=[('Content-type','text/html')]): |
33 for header in headers: |
41 for header in headers: |
34 self.out.write("%s: %s\r\n" % header) |
42 self.out.write("%s: %s\r\n" % header) |
35 self.out.write("\r\n") |
43 self.out.write("\r\n") |
36 |
44 |
37 def httphdr(self, type, file="", size=0): |
45 def httphdr(self, type, filename=None, length=0): |
38 |
46 |
39 headers = [('Content-type', type)] |
47 headers = [('Content-type', type)] |
40 if file: |
48 if filename: |
41 headers.append(('Content-disposition', 'attachment; filename=%s' % file)) |
49 headers.append(('Content-disposition', 'attachment; filename=%s' % |
42 if size > 0: |
50 filename)) |
43 headers.append(('Content-length', str(size))) |
51 # we do not yet support http 1.1 chunked transfer, so we have |
|
52 # to force connection to close if content-length not known |
|
53 if length: |
|
54 headers.append(('Content-length', str(length))) |
|
55 self.will_close = False |
|
56 else: |
|
57 headers.append(('Connection', 'close')) |
|
58 self.will_close = True |
44 self.header(headers) |
59 self.header(headers) |