diff mercurial/hgweb/server.py @ 41476:9b2b8794f801

hgweb: log error before attempting I/O Previously, an uncaught exception during HTTP request serving would attempt to send an error response then log the exception. If an exception occurred during I/O, this exception would be raised and the original exception wouldn't be logged. This commit changes behavior so the original exception is logged first, before we attempt to do anything else. This ensures the exception is logged. This change resulted in new tracebacks appearing in various tests. Because tracebacks can vary between Python versions, we added a simple script to filter the stack part of traceback lines. This makes testing much simpler, as we don't need to glob over lines and make lines conditional. Differential Revision: https://phab.mercurial-scm.org/D5749
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 30 Jan 2019 11:44:34 -0800
parents 52a4a3e7cc6a
children 6bbb12cba5a8
line wrap: on
line diff
--- a/mercurial/hgweb/server.py	Tue Jan 29 11:51:19 2019 -0800
+++ b/mercurial/hgweb/server.py	Wed Jan 30 11:44:34 2019 -0800
@@ -101,9 +101,8 @@
         try:
             self.do_write()
         except Exception:
-            self._start_response(r"500 Internal Server Error", [])
-            self._write(b"Internal Server Error")
-            self._done()
+            # I/O below could raise another exception. So log the original
+            # exception first to ensure it is recorded.
             tb = r"".join(traceback.format_exception(*sys.exc_info()))
             # We need a native-string newline to poke in the log
             # message, because we won't get a newline when using an
@@ -112,6 +111,10 @@
             self.log_error(r"Exception happened during processing "
                            r"request '%s':%s%s", self.path, newline, tb)
 
+            self._start_response(r"500 Internal Server Error", [])
+            self._write(b"Internal Server Error")
+            self._done()
+
     def do_PUT(self):
         self.do_POST()