diff -r 1ed74994c3e3 Lib/urllib.py --- a/Lib/urllib.py Fri Jun 24 11:39:57 2016 -0700 +++ b/Lib/urllib.py Fri Sep 16 16:26:57 2016 +0500 @@ -180,7 +180,7 @@ self.addheaders.append(args) # External interface - def open(self, fullurl, data=None): + def open(self, fullurl, data=None, ftp_retrieve=False): """Use URLopener().open(file) instead of open(file, 'r').""" fullurl = unwrap(toBytes(fullurl)) # percent encode url, fixing lame server errors for e.g, like space @@ -210,9 +210,11 @@ return self.open_unknown(fullurl, data) try: if data is None: - return getattr(self, name)(url) + if self.type == 'ftp': return getattr(self, name)(url, ftp_retrieve) + else: return getattr(self, name)(url) else: - return getattr(self, name)(url, data) + if self.type == 'ftp': return getattr(self, name)(url, data, ftp_retrieve) + else: return getattr(self, name)(url, data) except socket.error, msg: raise IOError, ('socket error', msg), sys.exc_info()[2] @@ -242,7 +244,7 @@ return url2pathname(splithost(url1)[1]), hdrs except IOError: pass - fp = self.open(url, data) + fp = self.open(url, data, ftp_retrieve=True) try: headers = fp.info() if filename: @@ -505,7 +507,7 @@ headers, urlfile) raise IOError, ('local file error', 'not on local host') - def open_ftp(self, url): + def open_ftp(self, url, ftp_retrieve=False): """Use FTP protocol.""" if not isinstance(url, str): raise IOError, ('ftp error', 'proxy support for ftp protocol currently not implemented') @@ -555,7 +557,7 @@ if attr.lower() == 'type' and \ value in ('a', 'A', 'i', 'I', 'd', 'D'): type = value.upper() - (fp, retrlen) = self.ftpcache[key].retrfile(file, type) + (fp, retrlen) = self.ftpcache[key].retrfile(file, type, ftp_retrieve) mtype = mimetypes.guess_type("ftp:" + url)[0] headers = "" if mtype: @@ -888,7 +890,7 @@ _target = '/'.join(self.dirs) self.ftp.cwd(_target) - def retrfile(self, file, type): + def retrfile(self, file, type, ftp_retrieve=False): import ftplib self.endtransfer() if type in ('d', 'D'): cmd = 'TYPE A'; isdir = 1 @@ -904,6 +906,8 @@ try: cmd = 'RETR ' + file conn, retrlen = self.ftp.ntransfercmd(cmd) + if ftp_retrieve: + self.ftp.voidresp() except ftplib.error_perm, reason: if str(reason)[:3] != '550': raise IOError, ('ftp error', reason), sys.exc_info()[2]