annotate examples/trac/trac/web/wsgi.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2005 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 # Author: Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 import sys
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18 from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 from SocketServer import ForkingMixIn, ThreadingMixIn
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 import urllib
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 class _ErrorsWrapper(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 def __init__(self, logfunc):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 self.logfunc = logfunc
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 def flush(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 pass
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 def write(self, msg):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 self.logfunc(msg)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 def writelines(self, seq):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 map(self.write, seq)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 class _FileWrapper(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39 """Wrapper for sending a file as response."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 def __init__(self, fileobj, blocksize=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 self.fileobj = fileobj
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 self.blocksize = blocksize
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44 self.read = self.fileobj.read
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 if hasattr(fileobj, 'close'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 self.close = fileobj.close
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 def __iter__(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49 return self
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 def next(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 data = self.fileobj.read(self.blocksize)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 if not data:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 raise StopIteration
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55 return data
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58 class WSGIGateway(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 """Abstract base class for WSGI servers or gateways."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 wsgi_version = (1, 0)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 wsgi_multithread = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 wsgi_multiprocess = True
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 wsgi_run_once = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 wsgi_file_wrapper = _FileWrapper
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 def __init__(self, environ, stdin=sys.stdin, stderr=sys.stderr):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 """Initialize the gateway object."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 environ['wsgi.version'] = self.wsgi_version
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 environ['wsgi.url_scheme'] = 'http'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 if environ.get('HTTPS', '').lower() in ('yes', 'on', '1'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 environ['wsgi.url_scheme'] = 'https'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 environ['wsgi.input'] = stdin
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 environ['wsgi.errors'] = stderr
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 environ['wsgi.multithread'] = self.wsgi_multithread
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 environ['wsgi.multiprocess'] = self.wsgi_multiprocess
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 environ['wsgi.run_once'] = self.wsgi_run_once
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 if self.wsgi_file_wrapper is not None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 environ['wsgi.file_wrapper'] = self.wsgi_file_wrapper
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 self.environ = environ
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 self.headers_set = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 self.headers_sent = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 def run(self, application):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 """Start the gateway with the given WSGI application."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 response = application(self.environ, self._start_response)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 if isinstance(response, self.wsgi_file_wrapper) \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 and hasattr(self, '_sendfile'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 self._sendfile(response.fileobj)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 for chunk in response:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 if chunk:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95 self._write(chunk)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 if not self.headers_sent:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 self._write('')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 if hasattr(response, 'close'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 response.close()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 def _start_response(self, status, headers, exc_info=None):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 """Callback for starting a HTTP response."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 if exc_info:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 if self.headers_sent: # Re-raise original exception
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 raise exc_info[0], exc_info[1], exc_info[2]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 finally:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 exc_info = None # avoid dangling circular ref
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 assert not self.headers_set, 'Response already started'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 self.headers_set = [status, headers]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 return self._write
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 def _write(self, data):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 """Callback for writing data to the response.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 Concrete subclasses must implement this method."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 raise NotImplementedError
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 class WSGIRequestHandler(BaseHTTPRequestHandler):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 def setup_environ(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 self.raw_requestline = self.rfile.readline()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 if not self.parse_request(): # An error code has been sent, just exit
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 self.close_connection = 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 environ = self.server.environ.copy()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 environ['SERVER_PROTOCOL'] = self.request_version
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 environ['REQUEST_METHOD'] = self.command
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 if '?' in self.path:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 path_info, query_string = self.path.split('?', 1)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 path_info, query_string = self.path, ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139 environ['PATH_INFO'] = urllib.unquote(path_info)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 environ['QUERY_STRING'] = query_string
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 host = self.address_string()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 if host != self.client_address[0]:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 environ['REMOTE_HOST'] = host
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 environ['REMOTE_ADDR'] = self.client_address[0]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 if self.headers.typeheader is None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 environ['CONTENT_TYPE'] = self.headers.type
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 environ['CONTENT_TYPE'] = self.headers.typeheader
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 length = self.headers.getheader('content-length')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153 if length:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 environ['CONTENT_LENGTH'] = length
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 for name, value in [header.split(':', 1) for header
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 in self.headers.headers]:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 name = name.replace('-', '_').upper();
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 value = value.strip()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 if name in environ:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 # skip content length, type, etc.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 continue
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 if 'HTTP_' + name in environ:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 # comma-separate multiple headers
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 environ['HTTP_' + name] += ',' + value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 environ['HTTP_' + name] = value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 return environ
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 def handle_one_request(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 environ = self.setup_environ()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 gateway = self.server.gateway(self, environ)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 gateway.run(self.server.application)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 def finish(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 """We need to help the garbage collector a little."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 BaseHTTPRequestHandler.finish(self)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179 self.wfile = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 self.rfile = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 class WSGIServerGateway(WSGIGateway):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 def __init__(self, handler, environ):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 WSGIGateway.__init__(self, environ, handler.rfile,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 _ErrorsWrapper(lambda x: handler.log_error('%s', x)))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 self.handler = handler
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 def _write(self, data):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 assert self.headers_set, 'Response not started'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 if not self.headers_sent:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194 status, headers = self.headers_sent = self.headers_set
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 self.handler.send_response(int(status[:3]))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 for name, value in headers:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 self.handler.send_header(name, value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198 self.handler.end_headers()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 self.handler.wfile.write(data)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 class WSGIServer(HTTPServer):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 def __init__(self, server_address, application, gateway=WSGIServerGateway,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 request_handler=WSGIRequestHandler):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 HTTPServer.__init__(self, server_address, request_handler)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 self.application = application
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 gateway.wsgi_multithread = isinstance(self, ThreadingMixIn)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 gateway.wsgi_multiprocess = isinstance(self, ForkingMixIn)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 self.gateway = gateway
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 self.environ = {'SERVER_NAME': self.server_name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 'SERVER_PORT': str(self.server_port),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 'SCRIPT_NAME': ''}
Copyright (C) 2012-2017 Edgewall Software