Skip to content

Commit ea4b175

Browse files
committed
Merge pull request scrapy#1254 from scrapy/bugfix-1232
[MRG +1] Unquote request path before passing to FTPClient, it already escape paths
2 parents 08501bf + ebe889a commit ea4b175

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

scrapy/core/downloader/handlers/ftp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
import re
3232
from io import BytesIO
33-
from six.moves.urllib.parse import urlparse
33+
from six.moves.urllib.parse import urlparse, unquote
3434

3535
from twisted.internet import reactor
3636
from twisted.protocols.ftp import FTPClient, CommandFailed
@@ -73,7 +73,7 @@ def download_request(self, request, spider):
7373
request.meta["ftp_password"],
7474
passive=request.meta.get("ftp_passive", 1))
7575
return creator.connectTCP(parsed_url.hostname, parsed_url.port or 21).addCallback(self.gotClient,
76-
request, parsed_url.path)
76+
request, unquote(parsed_url.path))
7777

7878
def gotClient(self, client, request, filepath):
7979
self.client = client

tests/test_downloader_handlers.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,9 @@ def setUp(self):
511511
os.mkdir(self.directory)
512512
userdir = os.path.join(self.directory, self.username)
513513
os.mkdir(userdir)
514-
FilePath(userdir).child('file.txt').setContent("I have the power!")
514+
fp = FilePath(userdir)
515+
fp.child('file.txt').setContent("I have the power!")
516+
fp.child('file with spaces.txt').setContent("Moooooooooo power!")
515517

516518
# setup server
517519
realm = FTPRealm(anonymousRoot=self.directory, userHome=self.directory)
@@ -547,6 +549,19 @@ def _test(r):
547549
self.assertEqual(r.headers, {'Local Filename': [''], 'Size': ['17']})
548550
return self._add_test_callbacks(d, _test)
549551

552+
def test_ftp_download_path_with_spaces(self):
553+
request = Request(
554+
url="ftp://127.0.0.1:%s/file with spaces.txt" % self.portNum,
555+
meta={"ftp_user": self.username, "ftp_password": self.password}
556+
)
557+
d = self.download_handler.download_request(request, None)
558+
559+
def _test(r):
560+
self.assertEqual(r.status, 200)
561+
self.assertEqual(r.body, 'Moooooooooo power!')
562+
self.assertEqual(r.headers, {'Local Filename': [''], 'Size': ['18']})
563+
return self._add_test_callbacks(d, _test)
564+
550565
def test_ftp_download_notexist(self):
551566
request = Request(url="ftp://127.0.0.1:%s/notexist.txt" % self.portNum,
552567
meta={"ftp_user": self.username, "ftp_password": self.password})

0 commit comments

Comments
 (0)