I'd like to suggest this patch as an alternative to the last one I posted. I didn't realize that other exceptions (such as those caused in PTL templates) are not wrapped in PublishErrors. This patch catches all exceptions from the Publisher, and wraps non-PublishError exceptions in a medusa_http.ServerError instance. -- Graham --- C:\projects\Quixote-0.6b1\server\medusa_http.py Fri Jan 17 00:42:48 2003 +++ C:\Python22\Lib\site-packages\quixote\server\medusa_http.py Fri Jan 17 13:44:52 2003 @@ -15,4 +15,22 @@ from quixote.http_request import HTTPRequest from quixote.publish import Publisher +from quixote.errors import PublishError +import sys +import traceback + +class ServerError (PublishError): + """ + Raised when a non-PublishError exception is raised in the publisher. + """ + status_code = 500 + title = "Server Error" + description = "Server Error" + + def __init__ (self): + e1,e2,e3 = sys.exc_info() + public_msg = 'An error occured in the application.' + private_msg = ''.join(traceback.format_exception(e1,e2,e3)) + PublishError.__init__(self, public_msg, private_msg) + print private_msg class QuixoteHandler: @@ -52,4 +70,6 @@ 'HTTP_COOKIE':msg.get('Cookie'), 'HTTP_REFERER':msg.get('Referer'), + 'ACCEPT_ENCODING':msg.get('Accept-encoding'), + 'HTTP_USER_AGENT':msg.get('user-agent'), 'PATH_INFO':request.uri, 'QUERY_STRING':query_string, @@ -63,14 +83,19 @@ 'SERVER_SOFTWARE':self.server_name, } - for k,v in environ.items(): - if v == None: - environ[k] = '' + for k,v in environ.items(): + if v == None: + environ[k] = '' stdin = StringIO(data) qreq = HTTPRequest(stdin, environ) qreq.process_inputs() - output = self.publisher.process_request(qreq, environ) + try: + output = self.publisher.process_request(qreq, environ) + except Exception, err: + if not isinstance(err, PublishError): + err = ServerError() + output = self.publisher.finish_interrupted_request(qreq, err) if output: - qreq.response.set_body(output) + qreq.response.set_body(str(output)) output_file = StringIO()