comparison mercurial/hgweb/request.py @ 5561:22713dce19f6

hgweb: return meaningful HTTP status codes instead of nonsense
author Bryan O'Sullivan <bos@serpentine.com>
date Wed, 28 Nov 2007 08:38:42 -0800
parents ff7253a0d1da
children d61fea133f2d
comparison
equal deleted inserted replaced
5560:e78c24011001 5561:22713dce19f6
6 # This software may be used and distributed according to the terms 6 # This software may be used and distributed according to the terms
7 # of the GNU General Public License, incorporated herein by reference. 7 # of the GNU General Public License, incorporated herein by reference.
8 8
9 import socket, cgi, errno 9 import socket, cgi, errno
10 from mercurial.i18n import gettext as _ 10 from mercurial.i18n import gettext as _
11 from common import ErrorResponse
11 12
12 class wsgiapplication(object): 13 class wsgiapplication(object):
13 def __init__(self, destmaker): 14 def __init__(self, destmaker):
14 self.destmaker = destmaker 15 self.destmaker = destmaker
15 16
40 return iter([]) 41 return iter([])
41 42
42 def read(self, count=-1): 43 def read(self, count=-1):
43 return self.inp.read(count) 44 return self.inp.read(count)
44 45
45 def write(self, *things): 46 def respond(self, status, *things):
46 for thing in things: 47 for thing in things:
47 if hasattr(thing, "__iter__"): 48 if hasattr(thing, "__iter__"):
48 for part in thing: 49 for part in thing:
49 self.write(part) 50 self.respond(status, part)
50 else: 51 else:
51 thing = str(thing) 52 thing = str(thing)
52 if self.server_write is None: 53 if self.server_write is None:
53 if not self.headers: 54 if not self.headers:
54 raise RuntimeError("request.write called before headers sent (%s)." % thing) 55 raise RuntimeError("request.write called before headers sent (%s)." % thing)
55 self.server_write = self.start_response('200 Script output follows', 56 code = None
57 if isinstance(status, ErrorResponse):
58 code = status.code
59 elif isinstance(status, int):
60 code = status
61 if code:
62 from httplib import responses
63 status = '%d %s' % (
64 code, responses.get(code, 'Error'))
65 self.server_write = self.start_response(status,
56 self.headers) 66 self.headers)
57 self.start_response = None 67 self.start_response = None
58 self.headers = None 68 self.headers = []
59 try: 69 try:
60 self.server_write(thing) 70 self.server_write(thing)
61 except socket.error, inst: 71 except socket.error, inst:
62 if inst[0] != errno.ECONNRESET: 72 if inst[0] != errno.ECONNRESET:
63 raise 73 raise
74
75 def write(self, *things):
76 self.respond('200 Script output follows', *things)
64 77
65 def writelines(self, lines): 78 def writelines(self, lines):
66 for line in lines: 79 for line in lines:
67 self.write(line) 80 self.write(line)
68 81