Issue 22435: socketserver.TCPSocket leaks socket to garbage collector if server_bind() fails (original) (raw)
Bind method may easily fail on Unix if there is no permission to bind to a privileged port:
try: TCPServer(("", 80), ...) ... except Exception as err: err ... PermissionError(13, 'Permission denied') gc.collect() main:1: ResourceWarning: unclosed <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)> 0
This problem is inherited by HTTPServer and WSGIServer. My current workaround includes this code in a BaseServer fixup mixin, invoking server_close() if init() fails:
class Server(BaseServer, Context): def init(self, ...): try: super().init((host, port), RequestHandlerClass) except: # Workaround for socketserver.TCPServer leaking socket self.close() raise
def close(self):
return self.server_close()