From 1760114913a43e8b21afdbd1252f21a3c37d533c Mon Sep 17 00:00:00 2001 From: Oleg Broytman Date: Fri, 21 Feb 2025 17:37:37 +0300 Subject: [PATCH] Refactor(Robots): Move `get_ftp()` into `util.py` --- Robots/bkmk_rrequests.py | 36 ++---------------------------------- Robots/util.py | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Robots/bkmk_rrequests.py b/Robots/bkmk_rrequests.py index e033d15..e75410e 100644 --- a/Robots/bkmk_rrequests.py +++ b/Robots/bkmk_rrequests.py @@ -11,9 +11,6 @@ __license__ = "GNU GPL" __all__ = ['robot_requests'] -from urllib.parse import urlsplit -import ftplib -import socket import warnings from requests.adapters import HTTPAdapter @@ -22,6 +19,7 @@ import requests import urllib3 from Robots.base import robot_base +from Robots.util import get_ftp class robot_requests(robot_base): @@ -30,7 +28,7 @@ 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 @@ -61,36 +59,6 @@ class robot_requests(robot_base): 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): diff --git a/Robots/util.py b/Robots/util.py index b978614..c7818ff 100644 --- a/Robots/util.py +++ b/Robots/util.py @@ -8,10 +8,12 @@ __author__ = "Oleg Broytman " __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'): @@ -53,3 +55,33 @@ 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) -- 2.39.5