Barry Warsaw pushed to branch master at mailman / Mailman

Commits:
3f550a97 by Barry Warsaw at 2015-08-23T20:44:14Z
When the client hangs up, we can't actually catch the BrokenPipeError because
of the way Python stdlib's wsgiref.simple_server is structured.  However, we
can ensure that the error messages won't get printed to stderr, but to our
http log file instead.

- - - - -
43627ee5 by Barry Warsaw at 2015-08-24T20:05:20Z
Refine REST server and request handler exception handling.

- - - - -
352096f9 by Barry Warsaw at 2015-08-25T00:33:14Z
Merge branch 'issue142' into 'master'

Send REST server stderr to the http log file when the client hangs up

When the client hangs up, we can't actually catch the BrokenPipeError because
of the way Python stdlib's wsgiref.simple_server is structured.  However, we
can ensure that the error messages won't get printed to stderr, but to our
http log file instead.

Closes #142

See merge request !36

- - - - -


1 changed file:

- src/mailman/rest/wsgiapp.py


Changes:

=====================================
src/mailman/rest/wsgiapp.py
=====================================
--- a/src/mailman/rest/wsgiapp.py
+++ b/src/mailman/rest/wsgiapp.py
@@ -32,16 +32,27 @@ from falcon.routing import create_http_method_map
 from mailman.config import config
 from mailman.database.transaction import transactional
 from mailman.rest.root import Root
-from wsgiref.simple_server import WSGIRequestHandler
+from wsgiref.simple_server import WSGIRequestHandler, WSGIServer
 from wsgiref.simple_server import make_server as wsgi_server
 
 
 log = logging.getLogger('mailman.http')
 _missing = object()
 SLASH = '/'
+EMPTYSTRING = ''
 
 
 
+class AdminWSGIServer(WSGIServer):
+    """Server class that integrates error handling with our log files."""
+
+    def handle_error(self, request, client_address):
+        # Interpose base class method so that the exception gets printed to
+        # our log file rather than stderr.
+        log.exception('REST server exception during request from %s',
+                      client_address)
+
+
 class AdminWebServiceWSGIRequestHandler(WSGIRequestHandler):
     """Handler class which just logs output to the right place."""
 
@@ -49,6 +60,20 @@ class AdminWebServiceWSGIRequestHandler(WSGIRequestHandler):
         """See `BaseHTTPRequestHandler`."""
         log.info('%s - - %s', self.address_string(), format % args)
 
+    def get_stderr(self):
+        # Return a fake stderr object that will actually write its output to
+        # the log file.
+        class StderrLogger:
+            def __init__(self):
+                self._buffer = []
+            def write(self, message):
+                self._buffer.append(message)
+            def flush(self):
+                self._buffer.insert(0, 'REST request handler error:\n')
+                log.error(EMPTYSTRING.join(self._buffer))
+                self._buffer = []
+        return StderrLogger()
+
 
 class SetAPIVersion:
     """Falcon middleware object that sets the api_version on resources."""
@@ -176,5 +201,6 @@ def make_server():
     port = int(config.webservice.port)
     server = wsgi_server(
         host, port, make_application(),
+        server_class=AdminWSGIServer,
         handler_class=AdminWebServiceWSGIRequestHandler)
     return server



View it on GitLab: 
https://gitlab.com/mailman/mailman/compare/c265a58eea8bb7abbdaa4cdbc0f25cafb1d78626...352096f9903961915921ba2adfbe80d0467fdfb5
_______________________________________________
Mailman-checkins mailing list
Mailman-checkins@python.org
Unsubscribe: 
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org

Reply via email to