terom@7: terom@7: """ terom@7: WSGI application implementation terom@7: """ terom@7: terom@7: # for error reporting terom@7: import sys, traceback terom@7: terom@7: # for Request/Response terom@7: import http terom@7: terom@7: # for the request -> response bit :) terom@7: import handler terom@7: terom@7: def request_handler (env, start_response) : terom@7: """ terom@7: The actual request handling code terom@7: """ terom@7: terom@7: # build Request object terom@7: request = http.Request(env) terom@7: terom@7: try : terom@7: # request -> response terom@7: response = handler.handle_request(request) terom@7: terom@7: except http.ResponseError, err : terom@7: # just use the generated response terom@7: response = err.get_response() terom@7: terom@7: # send response terom@7: assert response, "No response" terom@7: terom@7: # send response status/headers terom@7: start_response(response.get_status(), response.get_headers()) terom@7: terom@7: # send respones data terom@7: yield response.get_data() terom@7: terom@7: def app (env, start_response) : terom@7: """ terom@7: Wraps request_handler to trap errors terom@7: """ terom@7: terom@7: try : terom@7: # passthrough request_handler terom@7: for chunk in request_handler(env, start_response) : terom@7: yield chunk terom@7: terom@7: except : terom@7: # execption info terom@7: info = sys.exc_info() terom@7: terom@7: # try and send 500 ISE to browser, if no headers yet... terom@7: start_response("500 Internal Server Error", [('Content-type', "text/plain; charset=utf8")], info) terom@7: terom@7: # send traceback terom@7: yield traceback.format_exc() terom@7: