Mercurial > public > mercurial-scm > hg-stable
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() |