comparison mercurial/hgweb/request.py @ 4246:cc81c512a531

avoid _wsgioutputfile <-> _wsgirequest circular reference We use the _wsgirequest object itself as the output file object. To avoid a "self.out = self" which would create another circular reference, we make the "out" attribute a trivial property.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Mon, 19 Mar 2007 19:07:39 -0300
parents eb0b4a2d70a9
children ca639faa38a2
comparison
equal deleted inserted replaced
4245:bd46b83b9692 4246:cc81c512a531
15 self.destmaker = destmaker 15 self.destmaker = destmaker
16 16
17 def __call__(self, wsgienv, start_response): 17 def __call__(self, wsgienv, start_response):
18 return _wsgirequest(self.destmaker(), wsgienv, start_response) 18 return _wsgirequest(self.destmaker(), wsgienv, start_response)
19 19
20 class _wsgioutputfile(object):
21 def __init__(self, request):
22 self.request = request
23
24 def write(self, data):
25 self.request.write(data)
26 def writelines(self, lines):
27 for line in lines:
28 self.write(line)
29 def flush(self):
30 return None
31 def close(self):
32 return None
33
34 class _wsgirequest(object): 20 class _wsgirequest(object):
35 def __init__(self, destination, wsgienv, start_response): 21 def __init__(self, destination, wsgienv, start_response):
36 version = wsgienv['wsgi.version'] 22 version = wsgienv['wsgi.version']
37 if (version < (1, 0)) or (version >= (2, 0)): 23 if (version < (1, 0)) or (version >= (2, 0)):
38 raise RuntimeError("Unknown and unsupported WSGI version %d.%d" \ 24 raise RuntimeError("Unknown and unsupported WSGI version %d.%d" \
39 % version) 25 % version)
40 self.inp = wsgienv['wsgi.input'] 26 self.inp = wsgienv['wsgi.input']
41 self.out = _wsgioutputfile(self)
42 self.server_write = None 27 self.server_write = None
43 self.err = wsgienv['wsgi.errors'] 28 self.err = wsgienv['wsgi.errors']
44 self.threaded = wsgienv['wsgi.multithread'] 29 self.threaded = wsgienv['wsgi.multithread']
45 self.multiprocess = wsgienv['wsgi.multiprocess'] 30 self.multiprocess = wsgienv['wsgi.multiprocess']
46 self.run_once = wsgienv['wsgi.run_once'] 31 self.run_once = wsgienv['wsgi.run_once']
47 self.env = wsgienv 32 self.env = wsgienv
48 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) 33 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1)
49 self.start_response = start_response 34 self.start_response = start_response
50 self.headers = [] 35 self.headers = []
51 destination.run_wsgi(self) 36 destination.run_wsgi(self)
37
38 out = property(lambda self: self)
52 39
53 def __iter__(self): 40 def __iter__(self):
54 return iter([]) 41 return iter([])
55 42
56 def read(self, count=-1): 43 def read(self, count=-1):
74 self.server_write(thing) 61 self.server_write(thing)
75 except socket.error, inst: 62 except socket.error, inst:
76 if inst[0] != errno.ECONNRESET: 63 if inst[0] != errno.ECONNRESET:
77 raise 64 raise
78 65
66 def writelines(self, lines):
67 for line in lines:
68 self.write(line)
69
70 def flush(self):
71 return None
72
73 def close(self):
74 return None
75
79 def header(self, headers=[('Content-type','text/html')]): 76 def header(self, headers=[('Content-type','text/html')]):
80 self.headers.extend(headers) 77 self.headers.extend(headers)
81 78
82 def httphdr(self, type, filename=None, length=0, headers={}): 79 def httphdr(self, type, filename=None, length=0, headers={}):
83 headers = headers.items() 80 headers = headers.items()