Mercurial > public > mercurial-scm > hg-stable
comparison 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 |
comparison
equal
deleted
inserted
replaced
41475:c67f55b02f02 | 41476:9b2b8794f801 |
---|---|
99 | 99 |
100 def do_POST(self): | 100 def do_POST(self): |
101 try: | 101 try: |
102 self.do_write() | 102 self.do_write() |
103 except Exception: | 103 except Exception: |
104 self._start_response(r"500 Internal Server Error", []) | 104 # I/O below could raise another exception. So log the original |
105 self._write(b"Internal Server Error") | 105 # exception first to ensure it is recorded. |
106 self._done() | |
107 tb = r"".join(traceback.format_exception(*sys.exc_info())) | 106 tb = r"".join(traceback.format_exception(*sys.exc_info())) |
108 # We need a native-string newline to poke in the log | 107 # We need a native-string newline to poke in the log |
109 # message, because we won't get a newline when using an | 108 # message, because we won't get a newline when using an |
110 # r-string. This is the easy way out. | 109 # r-string. This is the easy way out. |
111 newline = chr(10) | 110 newline = chr(10) |
112 self.log_error(r"Exception happened during processing " | 111 self.log_error(r"Exception happened during processing " |
113 r"request '%s':%s%s", self.path, newline, tb) | 112 r"request '%s':%s%s", self.path, newline, tb) |
113 | |
114 self._start_response(r"500 Internal Server Error", []) | |
115 self._write(b"Internal Server Error") | |
116 self._done() | |
114 | 117 |
115 def do_PUT(self): | 118 def do_PUT(self): |
116 self.do_POST() | 119 self.do_POST() |
117 | 120 |
118 def do_GET(self): | 121 def do_GET(self): |