]> granicus.if.org Git - python/commitdiff
fix issue 9601: ftplib now provides a workaround for invalid response code returned...
authorGiampaolo Rodolà <g.rodola@gmail.com>
Mon, 23 Aug 2010 22:10:32 +0000 (22:10 +0000)
committerGiampaolo Rodolà <g.rodola@gmail.com>
Mon, 23 Aug 2010 22:10:32 +0000 (22:10 +0000)
Lib/ftplib.py
Lib/test/test_ftplib.py
Misc/NEWS

index 8a097c03657b23e85595e278a83e9c754a622ec1..ef69ca631ab35ef5f0755817d604162aab3b6e18 100644 (file)
@@ -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):
index c8d0d88e74e522e981e07bf96503595f2ef2109d..8164ede97679c8bc427f32339438a2c96759e7bb 100644 (file)
@@ -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):
 
index dbfdae59180d76c99e50349f2c5be039635202f7..e8dcca2c12a71bf42b708a90d06aa37b2d2578d8 100644 (file)
--- 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.