__all__ = ['robot_requests']
-from urllib.parse import urlsplit
-import ftplib
-import socket
import warnings
from requests.adapters import HTTPAdapter
import urllib3
from Robots.base import robot_base
+from Robots.util import get_ftp
class robot_requests(robot_base):
async def get(self, url, req_headers, use_proxy=False):
if url.startswith('ftp://'):
- error, welcome, body = _get_ftp(url, self.timeout)
+ error, welcome, body = get_ftp(url, self.timeout)
if error is not None:
return error, None, None, None
self.welcome = welcome
return welcome
-def _get_ftp(url, timeout):
- split_results = urlsplit(url)
- path = split_results.path or '/'
- user = split_results.username or 'anonymous'
- password = split_results.password or 'ftp'
- host = split_results.hostname
- port = split_results.port or 21
-
- ftp = ftplib.FTP()
- try:
- ftp.connect(host, port, timeout)
- ftp.login(user, password)
- if path != '/':
- ftp.cwd(path)
- except (socket.error, ftplib.Error) as e:
- return "Error: %s" % e, None, None
-
- files = []
- try:
- files = ftp.nlst()
- except ftplib.error_perm as e:
- if str(e).startswith("550 No files found"):
- return None, ftp.welcome, ''
- return "Error: %s" % e, None, None
- except ftplib.Error as e:
- return "Error: %s" % e, None, None
-
- return None, ftp.welcome, '\n'.join(files)
-
-
# See https://lukasa.co.uk/2017/02/Configuring_TLS_With_Requests/
class AllCiphersAdapter(HTTPAdapter):
__copyright__ = "Copyright (C) 2025 PhiloSoft Design"
__license__ = "GNU GPL"
-__all__ = ['encode_url']
+__all__ = ['encode_url', 'get_ftp']
from urllib.parse import urlsplit, parse_qsl, quote, quote_plus, urlencode
+import ftplib
+import socket
def encode_url(url, encoding='latin1'):
url += '#' + quote_plus(tag.encode(encoding))
return url
+
+
+def get_ftp(url, timeout):
+ split_results = urlsplit(url)
+ path = split_results.path or '/'
+ user = split_results.username or 'anonymous'
+ password = split_results.password or 'ftp'
+ host = split_results.hostname
+ port = split_results.port or 21
+
+ ftp = ftplib.FTP()
+ try:
+ ftp.connect(host, port, timeout)
+ ftp.login(user, password)
+ if path != '/':
+ ftp.cwd(path)
+ except (socket.error, ftplib.Error) as e:
+ return "Error: %s" % e, None, None
+
+ files = []
+ try:
+ files = ftp.nlst()
+ except ftplib.error_perm as e:
+ if str(e).startswith("550 No files found"):
+ return None, ftp.welcome, ''
+ return "Error: %s" % e, None, None
+ except ftplib.Error as e:
+ return "Error: %s" % e, None, None
+
+ return None, ftp.welcome, '\n'.join(files)