# HG changeset patch # User Augie Fackler # Date 2019-01-30 22:24:57 # Node ID 6bbb12cba5a8f2ffdbdb6b48c79387dfc7810f5c # Parent 8e0dd36f7a978bbc3e2917d83a9212f6d0eb65bf server: skip logging of ECONNRESET I believe this was exposed by 5492dc20, because the sending of the 500 would have already failed and prevented this logging. On Python 3, this will be a ConnectionResetError, which is a subtype of OSError, which is why we check for both OSError and socket.error. Bonus: this fixes a race in test-hgweb.t where sometimes the ECONNRESET wouldn't happen, because now we just don't log those errors. Differential Revision: https://phab.mercurial-scm.org/D5764 diff --git a/mercurial/hgweb/server.py b/mercurial/hgweb/server.py --- a/mercurial/hgweb/server.py +++ b/mercurial/hgweb/server.py @@ -100,16 +100,18 @@ class _httprequesthandler(httpservermod. def do_POST(self): try: self.do_write() - except Exception: + except Exception as e: # 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 - # r-string. This is the easy way out. - newline = chr(10) - self.log_error(r"Exception happened during processing " - r"request '%s':%s%s", self.path, newline, tb) + if not (isinstance(e, (OSError, socket.error)) + and e.errno == errno.ECONNRESET): + 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 + # r-string. This is the easy way out. + newline = chr(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") diff --git a/tests/test-hgweb.t b/tests/test-hgweb.t --- a/tests/test-hgweb.t +++ b/tests/test-hgweb.t @@ -911,18 +911,6 @@ Test signal-safe-lock in web and non-web errors $ cat errors.log | "$PYTHON" $TESTDIR/filtertraceback.py - $LOCALIP - - [$ERRDATE$] Exception happened during processing request '/?cmd=spam': (glob) - Traceback (most recent call last): - error: [Errno 104] $ECONNRESET$ - - $LOCALIP - - [$ERRDATE$] Exception happened during processing request '/spam': (glob) - Traceback (most recent call last): - error: [Errno 104] $ECONNRESET$ - - $LOCALIP - - [$ERRDATE$] Exception happened during processing request '/spam/tip/foo': (glob) - Traceback (most recent call last): - error: [Errno 104] $ECONNRESET$ - $ rm -f errors.log Uncaught exceptions result in a logged error and canned HTTP response