From: Giampaolo RodolĂ  Date: Mon, 23 Aug 2010 22:10:32 +0000 (+0000) Subject: fix issue 9601: ftplib now provides a workaround for invalid response code returned... X-Git-Tag: v3.2a2~153 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bbc4782d77ac76e317182fb2400c6b7e1c305bdd;p=python fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003 --- diff --git a/Lib/ftplib.py b/Lib/ftplib.py index 8a097c0365..ef69ca631a 100644 --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -565,7 +565,11 @@ class FTP: def mkd(self, dirname): '''Make a directory, return its full pathname.''' - resp = self.sendcmd('MKD ' + dirname) + resp = self.voidcmd('MKD ' + dirname) + # fix around non-compliant implementations such as IIS shipped + # with Windows server 2003 + if not resp.startswith('257'): + return '' return parse257(resp) def rmd(self, dirname): @@ -574,7 +578,11 @@ class FTP: def pwd(self): '''Return current working directory.''' - resp = self.sendcmd('PWD') + resp = self.voidcmd('PWD') + # fix around non-compliant implementations such as IIS shipped + # with Windows server 2003 + if not resp.startswith('257'): + return '' return parse257(resp) def quit(self): diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index c8d0d88e74..8164ede976 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -606,6 +606,18 @@ class TestFTPClass(TestCase): self.assertEqual(self.server.handler_instance.last_received_cmd, 'quit') self.assertFalse(is_client_connected()) + def test_parse257(self): + self.assertEqual(ftplib.parse257('257 "/foo/bar"'), '/foo/bar') + self.assertEqual(ftplib.parse257('257 "/foo/bar" created'), '/foo/bar') + self.assertEqual(ftplib.parse257('257 ""'), '') + self.assertEqual(ftplib.parse257('257 "" created'), '') + self.assertRaises(ftplib.error_reply, ftplib.parse257, '250 "/foo/bar"') + # The 257 response is supposed to include the directory + # name and in case it contains embedded double-quotes + # they must be doubled (see RFC-959, chapter 7, appendix 2). + self.assertEqual(ftplib.parse257('257 "/foo/b""ar"'), '/foo/b"ar') + self.assertEqual(ftplib.parse257('257 "/foo/b""ar" created'), '/foo/b"ar') + class TestIPv6Environment(TestCase): diff --git a/Misc/NEWS b/Misc/NEWS index dbfdae5918..e8dcca2c12 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -123,8 +123,12 @@ Extensions Library ------- +- Issue #9601: ftplib now provides a workaround for non-compliant + implementations such as IIS shipped with Windows server 2003 returning invalid + response codes for MKD and PWD commands. + - Issue #658749: asyncore's connect() method now correctly interprets winsock - errors; + errors. - Issue #9501: Fixed logging regressions in cleanup code. @@ -291,6 +295,8 @@ Tools/Demos Tests ----- +- Issue #9601: Provide a test case for ftplib.parse257. + - Issue #8857: Provide a test case for socket.getaddrinfo. - Issue #7564: Skip test_ioctl if another process is attached to /dev/tty.