# HG changeset patch # User Ivan Pozdeev # Date 1481399166 -10800 # Sat Dec 10 22:46:06 2016 +0300 # Branch 2.7 # Node ID 77b200049fe9d3fa41c93ff3c790ce5b7873f597 # Parent e414fb1640e05ae6f764f2b95bae8380d46c038d urllib ignores FTP 226 response after file transfer diff -r e414fb1640e0 -r 77b200049fe9 Lib/urllib.py --- a/Lib/urllib.py Wed Dec 07 23:34:23 2016 -0500 +++ b/Lib/urllib.py Sat Dec 10 22:46:06 2016 +0300 @@ -927,7 +927,7 @@ self.busy = 1 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) @@ -940,7 +940,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() @@ -990,15 +997,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: - addbase.close(self) + addbase.close(self) + closehook = self.closehook + hookargs = self.hookargs + if closehook: + self.closehook = None + self.hookargs = None + closehook(*hookargs) class addinfo(addbase):