wsgicgi.py
70 lines
| 2.2 KiB
| text/x-python
|
PythonLexer
Eric Hopper
|
r2506 | # hgweb/wsgicgi.py - CGI->WSGI translator | ||
# | ||||
# Copyright 2006 Eric Hopper <hopper@omnifarious.org> | ||||
# | ||||
# This software may be used and distributed according to the terms | ||||
# of the GNU General Public License, incorporated herein by reference. | ||||
# | ||||
# This was originally copied from the public domain code at | ||||
# http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side | ||||
import os, sys | ||||
def launch(application): | ||||
environ = dict(os.environ.items()) | ||||
environ['wsgi.input'] = sys.stdin | ||||
environ['wsgi.errors'] = sys.stderr | ||||
environ['wsgi.version'] = (1,0) | ||||
environ['wsgi.multithread'] = False | ||||
environ['wsgi.multiprocess'] = True | ||||
environ['wsgi.run_once'] = True | ||||
if environ.get('HTTPS','off') in ('on','1'): | ||||
environ['wsgi.url_scheme'] = 'https' | ||||
else: | ||||
environ['wsgi.url_scheme'] = 'http' | ||||
headers_set = [] | ||||
headers_sent = [] | ||||
Alexis S. L. Carvalho
|
r2558 | out = sys.stdout | ||
Eric Hopper
|
r2506 | |||
def write(data): | ||||
if not headers_set: | ||||
raise AssertionError("write() before start_response()") | ||||
elif not headers_sent: | ||||
# Before the first output, send the stored headers | ||||
status, response_headers = headers_sent[:] = headers_set | ||||
Alexis S. L. Carvalho
|
r2558 | out.write('Status: %s\r\n' % status) | ||
Eric Hopper
|
r2506 | for header in response_headers: | ||
Alexis S. L. Carvalho
|
r2558 | out.write('%s: %s\r\n' % header) | ||
out.write('\r\n') | ||||
Eric Hopper
|
r2506 | |||
Alexis S. L. Carvalho
|
r2558 | out.write(data) | ||
out.flush() | ||||
Eric Hopper
|
r2506 | |||
def start_response(status,response_headers,exc_info=None): | ||||
if exc_info: | ||||
try: | ||||
if headers_sent: | ||||
# Re-raise original exception if headers sent | ||||
raise exc_info[0], exc_info[1], exc_info[2] | ||||
finally: | ||||
exc_info = None # avoid dangling circular ref | ||||
elif headers_set: | ||||
raise AssertionError("Headers already set!") | ||||
headers_set[:] = [status,response_headers] | ||||
return write | ||||
result = application(environ, start_response) | ||||
try: | ||||
for data in result: | ||||
if data: # don't send headers until body appears | ||||
write(data) | ||||
if not headers_sent: | ||||
write('') # send headers now if body was empty | ||||
finally: | ||||
if hasattr(result,'close'): | ||||
result.close() | ||||