Pārlūkot izejas kodu

Log all error messages from wsgiref server to the logging module. This makes the test suit quiet again.

Signed-off-by: Jelmer Vernooij <jelmer@samba.org>
Gary van der Merwe 12 gadi atpakaļ
vecāks
revīzija
0f0a6f4ba3
3 mainītis faili ar 44 papildinājumiem un 7 dzēšanām
  1. 3 0
      NEWS
  2. 5 4
      dulwich/tests/compat/test_web.py
  3. 36 3
      dulwich/web.py

+ 3 - 0
NEWS

@@ -21,6 +21,9 @@
   * Support relative paths in alternate paths.
     (milki, Michel Lespinasse, #1175007)
 
+  * Log all error messages from wsgiref server to the logging module. This
+    makes the test suit quiet again. (Gary van der Merwe)
+
  IMPROVEMENTS:
 
   * Add optional honor_filemode flag to build_index_from_tree.

+ 5 - 4
dulwich/tests/compat/test_web.py

@@ -36,7 +36,8 @@ from dulwich.tests import (
 from dulwich.web import (
     make_wsgi_chain,
     HTTPGitApplication,
-    HTTPGitRequestHandler,
+    WSGIRequestHandlerLogger,
+    WSGIServerLogger,
     )
 
 from dulwich.tests.compat.server_utils import (
@@ -50,9 +51,9 @@ from dulwich.tests.compat.utils import (
 
 
 if getattr(simple_server.WSGIServer, 'shutdown', None):
-    WSGIServer = simple_server.WSGIServer
+    WSGIServer = WSGIServerLogger
 else:
-    class WSGIServer(ShutdownServerMixIn, simple_server.WSGIServer):
+    class WSGIServer(ShutdownServerMixIn, WSGIServerLogger):
         """Subclass of WSGIServer that can be shut down."""
 
         def __init__(self, *args, **kwargs):
@@ -77,7 +78,7 @@ class WebTests(ServerTests):
         app = self._make_app(backend)
         dul_server = simple_server.make_server(
           'localhost', 0, app, server_class=WSGIServer,
-          handler_class=HTTPGitRequestHandler)
+          handler_class=WSGIRequestHandlerLogger)
         self.addCleanup(dul_server.shutdown)
         threading.Thread(target=dul_server.serve_forever).start()
         self._server = dul_server

+ 36 - 3
dulwich/web.py

@@ -403,11 +403,25 @@ def make_wsgi_chain(*args, **kwargs):
 try:
     from wsgiref.simple_server import (
         WSGIRequestHandler,
+        ServerHandler,
+        WSGIServer,
         make_server,
     )
+    class ServerHandlerLogger(ServerHandler):
+        """ServerHandler that uses dulwich's logger for logging exceptions."""
+        
+        def log_exception(self, exc_info):
+            logger.exception('Exception happened during processing of request',
+                             exc_info=exc_info)
+
+        def log_message(self, format, *args):
+            logger.info(format, *args)
+
+        def log_error(self, *args):
+            logger.error(*args)
 
-    class HTTPGitRequestHandler(WSGIRequestHandler):
-        """Handler that uses dulwich's logger for logging exceptions."""
+    class WSGIRequestHandlerLogger(WSGIRequestHandler):
+        """WSGIRequestHandler that uses dulwich's logger for logging exceptions."""
 
         def log_exception(self, exc_info):
             logger.exception('Exception happened during processing of request',
@@ -418,6 +432,24 @@ try:
 
         def log_error(self, *args):
             logger.error(*args)
+        
+        def handle(self):
+            """Handle a single HTTP request"""
+    
+            self.raw_requestline = self.rfile.readline()
+            if not self.parse_request(): # An error code has been sent, just exit
+                return
+    
+            handler = ServerHandlerLogger(
+                self.rfile, self.wfile, self.get_stderr(), self.get_environ()
+            )
+            handler.request_handler = self      # backpointer for logging
+            handler.run(self.server.get_app())
+    
+    class WSGIServerLogger(WSGIServer):
+        def handle_error(self, request, client_address):
+            """Handle an error. """
+            logger.exception('Exception happened during processing of request from %s' % str(client_address))
 
     def main(argv=sys.argv):
         """Entry point for starting an HTTP git server."""
@@ -434,7 +466,8 @@ try:
         backend = DictBackend({'/': Repo(gitdir)})
         app = make_wsgi_chain(backend)
         server = make_server(listen_addr, port, app,
-                             handler_class=HTTPGitRequestHandler)
+                             handler_class=WSGIRequestHandlerLogger,
+                             server_class=WSGIServerLogger)
         logger.info('Listening for HTTP connections on %s:%d', listen_addr,
                     port)
         server.serve_forever()