[2.7] bpo-27973 - Fix for urllib.urlretrieve() failing on second ftp transfer (#1040)
* bpo-27973: Fix urllib.urlretrieve failing on subsequent ftp transfers from the same host. * bpo-35411: Skip test_urllibnet FTP tests on Travis CI.
This commit is contained in:
parent
362ede2232
commit
f82e59ac40
|
@ -1,5 +1,7 @@
|
|||
import tempfile
|
||||
import unittest
|
||||
from test import test_support
|
||||
from test.test_urllib2net import skip_ftp_test_on_travis
|
||||
|
||||
import socket
|
||||
import urllib
|
||||
|
@ -213,6 +215,40 @@ class urlopen_HttpsTests(unittest.TestCase):
|
|||
self.assertIn("Python", response.read())
|
||||
|
||||
|
||||
class urlopen_FTPTest(unittest.TestCase):
|
||||
FTP_TEST_FILE = 'ftp://www.pythontest.net/README'
|
||||
NUM_FTP_RETRIEVES = 3
|
||||
|
||||
@skip_ftp_test_on_travis
|
||||
def test_multiple_ftp_retrieves(self):
|
||||
|
||||
with test_support.transient_internet(self.FTP_TEST_FILE):
|
||||
try:
|
||||
for _ in range(self.NUM_FTP_RETRIEVES):
|
||||
with tempfile.NamedTemporaryFile() as fp:
|
||||
urllib.FancyURLopener().retrieve(self.FTP_TEST_FILE, fp.name)
|
||||
except IOError as e:
|
||||
self.fail("Failed FTP retrieve while accessing ftp url "
|
||||
"multiple times.\n Error message was : %s" % e)
|
||||
|
||||
@skip_ftp_test_on_travis
|
||||
def test_multiple_ftp_urlopen_same_host(self):
|
||||
with test_support.transient_internet(self.FTP_TEST_FILE):
|
||||
ftp_fds_to_close = []
|
||||
try:
|
||||
for _ in range(self.NUM_FTP_RETRIEVES):
|
||||
fd = urllib.urlopen(self.FTP_TEST_FILE)
|
||||
# test ftp open without closing fd as a supported scenario.
|
||||
ftp_fds_to_close.append(fd)
|
||||
except IOError as e:
|
||||
self.fail("Failed FTP binary file open. "
|
||||
"Error message was: %s" % e)
|
||||
finally:
|
||||
# close the open fds
|
||||
for fd in ftp_fds_to_close:
|
||||
fd.close()
|
||||
|
||||
|
||||
def test_main():
|
||||
test_support.requires('network')
|
||||
with test_support.check_py3k_warnings(
|
||||
|
@ -220,7 +256,8 @@ def test_main():
|
|||
test_support.run_unittest(URLTimeoutTest,
|
||||
urlopenNetworkTests,
|
||||
urlretrieveNetworkTests,
|
||||
urlopen_HttpsTests)
|
||||
urlopen_HttpsTests,
|
||||
urlopen_FTPTest)
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_main()
|
||||
|
|
|
@ -934,7 +934,13 @@ class ftpwrapper:
|
|||
return (ftpobj, retrlen)
|
||||
|
||||
def endtransfer(self):
|
||||
if not self.busy:
|
||||
return
|
||||
self.busy = 0
|
||||
try:
|
||||
self.ftp.voidresp()
|
||||
except ftperrors():
|
||||
pass
|
||||
|
||||
def close(self):
|
||||
self.keepalive = False
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix urllib.urlretrieve failing on subsequent ftp transfers from the same
|
||||
host.
|
Loading…
Reference in New Issue