# HG changeset patch # User Ivan Pozdeev # Date 1481427708 -10800 # Sun Dec 11 06:41:48 2016 +0300 # Node ID fe00286e135cc002a9bbbf3ab5ce7070d4cd70d9 # Parent 59b91b4e95060a696fdb65dae6ad498c37d9fd29 urllib ignores FTP 226 response after file transfer diff -r 59b91b4e9506 -r fe00286e135c Lib/urllib/request.py --- a/Lib/urllib/request.py Fri Nov 11 02:13:35 2016 +0100 +++ b/Lib/urllib/request.py Sun Dec 11 06:41:48 2016 +0300 @@ -2434,7 +2434,7 @@ ftpobj = addclosehook(conn.makefile('rb'), self.file_close) self.refcount += 1 - conn.close() + #conn.close() # Pass back both a suitably decorated object and a retrieval length return (ftpobj, retrlen) @@ -2447,7 +2447,14 @@ self.real_close() def file_close(self): + import ftplib self.endtransfer() + #Process the 226 transfer complete response + try: + self.ftp.voidresp() + except ftplib.error_temp as msg: + # transfer is aborted by urllib when some other exception has happened + if msg.args[0][:3] != '426': raise self.refcount -= 1 if self.refcount <= 0 and not self.keepalive: self.real_close() diff -r 59b91b4e9506 -r fe00286e135c Lib/urllib/response.py --- a/Lib/urllib/response.py Fri Nov 11 02:13:35 2016 +0100 +++ b/Lib/urllib/response.py Sun Dec 11 06:41:48 2016 +0300 @@ -43,15 +43,13 @@ self.hookargs = hookargs def close(self): - try: - closehook = self.closehook - hookargs = self.hookargs - if closehook: - self.closehook = None - self.hookargs = None - closehook(*hookargs) - finally: - super(addclosehook, self).close() + super(addclosehook, self).close() + closehook = self.closehook + hookargs = self.hookargs + if closehook: + self.closehook = None + self.hookargs = None + closehook(*hookargs) class addinfo(addbase):