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 |