From 5903d585617683da4a1e8005b7f2d7f9b385e26b Mon Sep 17 00:00:00 2001 From: Bert JW Regeer Date: Sun, 22 Jan 2023 20:59:41 -0700 Subject: [PATCH] Setting socket options may fail if remote has already disappeared By the time we come around to accepting a connection on macOS, the remote may have already disappeared, in which case setting options on the socket may fail with an error. Instead of failing and shutting down the server we want to continue, so move the setting of socket options into the try/except block and log the error instead. --- src/waitress/server.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/waitress/server.py b/src/waitress/server.py index 0378d48b..bbb68191 100644 --- a/src/waitress/server.py +++ b/src/waitress/server.py @@ -305,15 +305,19 @@ def handle_accept(self): if v is None: return conn, addr = v + self.set_socket_options(conn) except OSError: # Linux: On rare occasions we get a bogus socket back from # accept. socketmodule.c:makesockaddr complains that the # address family is unknown. We don't want the whole server # to shut down because of this. + # macOS: On occasions when the remote has already closed the socket + # before we got around to accepting it, when we try to set the + # socket options it will fail. So instead just we log the error and + # continue if self.adj.log_socket_errors: self.logger.warning("server accept() threw an exception", exc_info=True) return - self.set_socket_options(conn) addr = self.fix_addr(addr) self.channel_class(self, conn, addr, self.adj, map=self._map)