bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
"""
WSGI application implementation
"""
# for error reporting
import sys, traceback
# for Request/Response
import http
class Application (object) :
"""
Our WSGI application, implements the wsgi __call__ interface
"""
def __init__ (self, handler) :
"""
Initialize to use the given handler for requests
"""
self.handler = handler
def handle_request (self, env, start_response) :
"""
The actual request handling code
"""
# build Request object
request = http.Request(env)
try :
# request -> response using our handler
response = self.handler.handle_request(request)
except http.ResponseError, err :
# just use the generated response
response = err.get_response()
# send response
assert response, "No response"
# send response status/headers
start_response(response.get_status(), response.get_headers())
# send respones data
yield response.get_data()
def __call__ (self, env, start_response) :
"""
Wraps handle_request to trap errors
"""
try :
# passthrough request_handler
for chunk in self.handle_request(env, start_response) :
yield chunk
except :
# execption info
info = sys.exc_info()
# try and send 500 ISE to browser, if no headers yet...
start_response("500 Internal Server Error", [('Content-type', "text/plain; charset=utf8")], info)
# send traceback
yield traceback.format_exc()