Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/hgweb/request.py @ 5993:948a41e77902
hgweb: explicit response status
author | Dirkjan Ochtman <dirkjan@ochtman.nl> |
---|---|
date | Fri, 01 Feb 2008 10:31:13 +0100 |
parents | c301f15c965a |
children | acfb9fa494e2 |
comparison
equal
deleted
inserted
replaced
5992:30c40ba10963 | 5993:948a41e77902 |
---|---|
15 version = wsgienv['wsgi.version'] | 15 version = wsgienv['wsgi.version'] |
16 if (version < (1, 0)) or (version >= (2, 0)): | 16 if (version < (1, 0)) or (version >= (2, 0)): |
17 raise RuntimeError("Unknown and unsupported WSGI version %d.%d" | 17 raise RuntimeError("Unknown and unsupported WSGI version %d.%d" |
18 % version) | 18 % version) |
19 self.inp = wsgienv['wsgi.input'] | 19 self.inp = wsgienv['wsgi.input'] |
20 self.server_write = None | |
21 self.err = wsgienv['wsgi.errors'] | 20 self.err = wsgienv['wsgi.errors'] |
22 self.threaded = wsgienv['wsgi.multithread'] | 21 self.threaded = wsgienv['wsgi.multithread'] |
23 self.multiprocess = wsgienv['wsgi.multiprocess'] | 22 self.multiprocess = wsgienv['wsgi.multiprocess'] |
24 self.run_once = wsgienv['wsgi.run_once'] | 23 self.run_once = wsgienv['wsgi.run_once'] |
25 self.env = wsgienv | 24 self.env = wsgienv |
26 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) | 25 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) |
27 self._start_response = start_response | 26 self._start_response = start_response |
27 self.server_write = None | |
28 self.headers = [] | 28 self.headers = [] |
29 | 29 |
30 def __iter__(self): | 30 def __iter__(self): |
31 return iter([]) | 31 return iter([]) |
32 | 32 |
33 def read(self, count=-1): | 33 def read(self, count=-1): |
34 return self.inp.read(count) | 34 return self.inp.read(count) |
35 | 35 |
36 def start_response(self, status): | 36 def respond(self, status, type=None, filename=None, length=0): |
37 if self._start_response is not None: | 37 if self._start_response is not None: |
38 | |
39 self.httphdr(type, filename, length) | |
38 if not self.headers: | 40 if not self.headers: |
39 raise RuntimeError("request.write called before headers sent") | 41 raise RuntimeError("request.write called before headers sent") |
40 | 42 |
41 for k, v in self.headers: | 43 for k, v in self.headers: |
42 if not isinstance(v, str): | 44 if not isinstance(v, str): |
43 raise TypeError('header value must be string: %r' % v) | 45 raise TypeError('header value must be string: %r' % v) |
44 | 46 |
45 if isinstance(status, ErrorResponse): | 47 if isinstance(status, ErrorResponse): |
46 status = statusmessage(status.code) | 48 status = statusmessage(status.code) |
49 elif status == 200: | |
50 status = '200 Script output follows' | |
47 elif isinstance(status, int): | 51 elif isinstance(status, int): |
48 status = statusmessage(status) | 52 status = statusmessage(status) |
49 | 53 |
50 self.server_write = self._start_response(status, self.headers) | 54 self.server_write = self._start_response(status, self.headers) |
51 self._start_response = None | 55 self._start_response = None |
52 self.headers = [] | 56 self.headers = [] |
53 | 57 |
54 def respond(self, status, *things): | 58 def write(self, thing): |
55 if not things: | 59 if hasattr(thing, "__iter__"): |
56 self.start_response(status) | 60 for part in thing: |
57 for thing in things: | 61 self.write(part) |
58 if hasattr(thing, "__iter__"): | 62 else: |
59 for part in thing: | 63 thing = str(thing) |
60 self.respond(status, part) | 64 try: |
61 else: | 65 self.server_write(thing) |
62 thing = str(thing) | 66 except socket.error, inst: |
63 self.start_response(status) | 67 if inst[0] != errno.ECONNRESET: |
64 try: | 68 raise |
65 self.server_write(thing) | |
66 except socket.error, inst: | |
67 if inst[0] != errno.ECONNRESET: | |
68 raise | |
69 | |
70 def write(self, *things): | |
71 self.respond('200 Script output follows', *things) | |
72 | 69 |
73 def writelines(self, lines): | 70 def writelines(self, lines): |
74 for line in lines: | 71 for line in lines: |
75 self.write(line) | 72 self.write(line) |
76 | 73 |
81 return None | 78 return None |
82 | 79 |
83 def header(self, headers=[('Content-Type','text/html')]): | 80 def header(self, headers=[('Content-Type','text/html')]): |
84 self.headers.extend(headers) | 81 self.headers.extend(headers) |
85 | 82 |
86 def httphdr(self, type, filename=None, length=0, headers={}): | 83 def httphdr(self, type=None, filename=None, length=0, headers={}): |
87 headers = headers.items() | 84 headers = headers.items() |
88 headers.append(('Content-Type', type)) | 85 if type is not None: |
86 headers.append(('Content-Type', type)) | |
89 if filename: | 87 if filename: |
90 headers.append(('Content-Disposition', 'inline; filename=%s' % | 88 headers.append(('Content-Disposition', 'inline; filename=%s' % |
91 filename)) | 89 filename)) |
92 if length: | 90 if length: |
93 headers.append(('Content-Length', str(length))) | 91 headers.append(('Content-Length', str(length))) |