New submission from Serhiy Ivanov <icegood1...@gmail.com>:
In case when FTP url is successfully connected via default FTPHandler in FTPHandler.connect_ftp then release of this stuff becomes total responsibility of user i.e. socket remains open, which leads to ResourceWarning in the garbage collector, in case if the user does nothing. Something like this solves issue in user area: class SafeFTPHandler(urllib.request.FTPHandler): ftp_object = None def __init__(self): super().__init__() def connect_ftp(self, user, passwd, host, port, dirs, timeout): self.ftp_object = super().connect_ftp(user, passwd, host, port, dirs, timeout) return self.ftp_object def ftp_response(self, req, response): self._close_ftp() return response def ftp_open(self, req): try: return super().ftp_open(req) except: self._close_ftp() raise def _close_ftp(self): if self.ftp_object: self.ftp_object.close() and further usage in OpenerDirector... In general case FTPHandler should be able to close immediately (in case if it raises as well) while re-using of the socket should be implemented only within CacheFTPHandler ---------- components: Library (Lib) messages: 378911 nosy: icegood priority: normal severity: normal status: open title: urllib ResourceWarning in case of usage of FTP type: resource usage versions: Python 3.10, Python 3.8, Python 3.9 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue42076> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com