diff options
author | Matt Bachmann <bachmann.matt@gmail.com> | 2017-05-20 09:56:17 -0400 |
---|---|---|
committer | Matt Bachmann <bachmann.matt@gmail.com> | 2017-05-20 09:56:17 -0400 |
commit | 8e21ecdeaa72402209db6c4794c38e6bceb524f5 (patch) | |
tree | aed52d42c1ce2419e5fe86efd0bcbf3aa6117c05 /buildlibxml.py | |
parent | dd8f17c958b5af133c5f4fe623d682952313e7ea (diff) | |
download | python-lxml-8e21ecdeaa72402209db6c4794c38e6bceb524f5.tar.gz |
Use ftplib when urllib fails
Diffstat (limited to 'buildlibxml.py')
-rw-r--r-- | buildlibxml.py | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/buildlibxml.py b/buildlibxml.py index bd2aec18..a4f2a849 100644 --- a/buildlibxml.py +++ b/buildlibxml.py @@ -2,12 +2,13 @@ import os, re, sys, subprocess import tarfile from distutils import log, version from contextlib import closing +from ftplib import FTP try: - from urlparse import urljoin, unquote + from urlparse import urljoin, unquote, urlparse from urllib import urlretrieve, urlopen, urlcleanup except ImportError: - from urllib.parse import urljoin, unquote + from urllib.parse import urljoin, unquote, urlparse from urllib.request import urlretrieve, urlopen, urlcleanup multi_make_options = [] @@ -134,6 +135,27 @@ def _find_content_encoding(response, default='iso8859-1'): def ftp_listdir(url): assert url.lower().startswith('ftp://') + try: + return _list_dir_urllib(url) + except IOError: + print("Requesting with urllib failed. Falling back to ftplib. Proxy argument will be ignored") + return _list_dir_ftplib(url) + + +def _list_dir_ftplib(url): + parts = urlparse(url) + ftp = FTP(parts.netloc) + try: + ftp.login() + ftp.cwd(parts.path) + data = [] + ftp.dir(data.append) + finally: + ftp.quit() + return parse_text_ftplist("\n".join(data)) + + +def _list_dir_urllib(url): with closing(urlopen(url)) as res: charset = _find_content_encoding(res) content_type = res.headers.get('Content-Type') |