durusmail: quixote-users: A better patch (Re: Exception-handling patch for medusa_http.py)
Exception-handling patch for medusa_http.py
2003-01-17
A better patch (Re: Exception-handling patch for medusa_http.py)
2003-01-17
A better patch (Re: Exception-handling patch for medusa_http.py)
2003-01-20
Re: A better patch (Re: Exception-handling patch for medusa_http.py)
2003-01-20
2003-01-17
A better patch (Re: Exception-handling patch for medusa_http.py)
Andrew Kuchling
2003-01-20
On Fri, Jan 17, 2003 at 01:47:24PM -0500, Graham Fawcett wrote:
>This patch catches all exceptions from the Publisher, and wraps
>non-PublishError exceptions in a medusa_http.ServerError instance.

Thanks for pointing out the problem, However, I think medusa_http.py
needs to match the logic of Publisher.publish(), which calls
finish_interrupted_request() if PublishError is raised and
finish_failed_request() if some other exception is raised.  This
simplifies the patch because there's no need to synthesize a
ServerError exception to call finish_failed_request().

The patch below also makes some more changes to call the publisher's
.create_request() and .parse_request() methods, so file uploads should
now work with the Medusa server, though I haven't tested this.

Does the patch below work for you?  If yes, then I'll check it in.

--amk

Index: medusa_http.py
===================================================================
--- medusa_http.py      (revision 20290)
+++ medusa_http.py      (working copy)
@@ -14,6 +14,7 @@
 from medusa import http_server, xmlrpc_handler
 from quixote.http_request import HTTPRequest
 from quixote.publish import Publisher
+from quixote.errors import PublishError

 class QuixoteHandler:
     def __init__ (self, publisher, server_name, server):
@@ -69,9 +70,15 @@
                 environ[k] = ''

         stdin = StringIO(data)
-        qreq = HTTPRequest(stdin, environ)
-        qreq.process_inputs()
-        output = self.publisher.process_request(qreq, environ)
+        qreq = self.publisher.create_request(stdin, environ)
+        try:
+            self.publisher.parse_request(qreq)
+            output = self.publisher.process_request(qreq, environ)
+        except PublishError, err:
+            output = self.publisher.finish_interrupted_request(qreq, err)
+        except:
+            output = self.publisher.finish_failed_request(qreq)
+
         if output:
             qreq.response.set_body(str(output))


reply