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)))