comparison mercurial/hgweb/request.py @ 5566:d74fc8dec2b4

Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
author Dirkjan Ochtman <dirkjan@ochtman.nl>
date Fri, 30 Nov 2007 18:23:18 +0100
parents d61fea133f2d
children 0145f9afb0e7
comparison
equal deleted inserted replaced
5565:feac5b0bf9ba 5566:d74fc8dec2b4
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, statusmessage 11 from common import ErrorResponse, statusmessage
12 12
13 class wsgiapplication(object): 13 class wsgirequest(object):
14 def __init__(self, destmaker): 14 def __init__(self, wsgienv, start_response):
15 self.destmaker = destmaker
16
17 def __call__(self, wsgienv, start_response):
18 return _wsgirequest(self.destmaker(), wsgienv, start_response)
19
20 class _wsgirequest(object):
21 def __init__(self, destination, wsgienv, start_response):
22 version = wsgienv['wsgi.version'] 15 version = wsgienv['wsgi.version']
23 if (version < (1, 0)) or (version >= (2, 0)): 16 if (version < (1, 0)) or (version >= (2, 0)):
24 raise RuntimeError("Unknown and unsupported WSGI version %d.%d" 17 raise RuntimeError("Unknown and unsupported WSGI version %d.%d"
25 % version) 18 % version)
26 self.inp = wsgienv['wsgi.input'] 19 self.inp = wsgienv['wsgi.input']
31 self.run_once = wsgienv['wsgi.run_once'] 24 self.run_once = wsgienv['wsgi.run_once']
32 self.env = wsgienv 25 self.env = wsgienv
33 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) 26 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1)
34 self.start_response = start_response 27 self.start_response = start_response
35 self.headers = [] 28 self.headers = []
36 destination.run_wsgi(self)
37 29
38 out = property(lambda self: self) 30 out = property(lambda self: self)
39 31
40 def __iter__(self): 32 def __iter__(self):
41 return iter([]) 33 return iter([])
90 headers.append(('Content-disposition', 'attachment; filename=%s' % 82 headers.append(('Content-disposition', 'attachment; filename=%s' %
91 filename)) 83 filename))
92 if length: 84 if length:
93 headers.append(('Content-length', str(length))) 85 headers.append(('Content-length', str(length)))
94 self.header(headers) 86 self.header(headers)
87
88 def wsgiapplication(app_maker):
89 application = app_maker()
90 def run_wsgi(env, respond):
91 application(env, respond)
92 return run_wsgi