]> git.phdru.name Git - bookmarks_db.git/commitdiff
Feat(bkmk_rrequests): Use ftplib directly, without requests_ftp
authorOleg Broytman <phd@phdru.name>
Thu, 15 Aug 2024 22:36:07 +0000 (01:36 +0300)
committerOleg Broytman <phd@phdru.name>
Fri, 16 Aug 2024 16:13:16 +0000 (19:13 +0300)
Robots/bkmk_rrequests.py
bkmk_db-venv
doc/ANNOUNCE
doc/ChangeLog
setup.py

index ebe90cbda2cd12c80214a505c3e34a3f254ddc66..a44cdd06b0cff4cad65b740018125e8430535681 100644 (file)
@@ -11,24 +11,31 @@ __license__ = "GNU GPL"
 __all__ = ['robot_requests']
 
 
+from urllib.parse import urlsplit
+import ftplib
+import socket
 import warnings
 
 from requests.adapters import HTTPAdapter
 from requests.packages.urllib3.util.ssl_ import create_urllib3_context
 import requests
-import requests_ftp
 import urllib3
 
 from Robots.bkmk_robot_base import robot_base, request_headers
 
-requests_ftp.monkeypatch_session()
-
 
 class robot_requests(robot_base):
     def version_str(self):
         return 'python-requests urllib3/%s' % urllib3.__version__
 
     def get(self, bookmark, url, accept_charset=False, use_proxy=False):
+        if url.startswith('ftp://'):
+            error, welcome, body = _get_ftp(url, self.timeout)
+            if error is not None:
+                return error, None, None, None, None
+            self.welcome = welcome
+            return None, None, None, None, body
+
         if accept_charset and bookmark.charset:
             headers = request_headers.copy()
             headers['Accept-Charset'] = bookmark.charset
@@ -67,7 +74,39 @@ class robot_requests(robot_base):
         return None, None, None, r.headers, r.content
 
     def get_ftp_welcome(self):
-        return ''  # Alas, requests_ftp doesn't store welcome message
+        welcome = self.welcome
+        self.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/
index 085c919656313098db1c0cb1d0171265a4ccb408..25608fc3bede67b00fa74e90f246b5303b41fb27 100644 (file)
@@ -8,7 +8,7 @@ if [ -z "$VIRTUAL_ENV" ]; then
          } &&
          . bkmk_db-venv/bin/activate &&
          pip install --compile --upgrade beautifulsoup4 lxml m_lib.full \
-         "requests[socks]" requests-ftp \
+         "requests[socks]" \
          pycurl certifi \
          aiohttp aioftp
     }
index bb9807bca2695ad345a8ecff889d85cefe7d8873..3b7d9a38a1ee23b1e70d1284753c0db496ff74a1 100644 (file)
@@ -7,6 +7,10 @@ bookmarks.html.
 
 WHAT'S NEW
 
+Version 5.7.0 (2024-??-??)
+
+   Robot bkmk_rrequests: Use ftplib directly, without requests_ftp.
+
 Version 5.6.1 (2024-08-15)
 
    Minor fixes.
index e3c6cc61e77b2ee162b90822530dcc705fa153c2..f213e72e741a5de179fb7850a63f6e40526f807f 100644 (file)
@@ -1,3 +1,7 @@
+Version 5.7.0 (2024-??-??)
+
+   Robot bkmk_rrequests: Use ftplib directly, without requests_ftp.
+
 Version 5.6.1 (2024-08-15)
 
    Minor fixes.
index 391890e0b2fb5bbbb7d9bfdbc843de94fae95b18..1c3160f73a94b83b0db32a63007f7940901d5b31 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -38,7 +38,7 @@ setup(
     ],
     extras_require={
         'html': ['beautifulsoup4', 'lxml'],
-        'requests': ['requests[socks]', 'requests-ftp'],
+        'requests': ['requests[socks]'],
         'curl': ['pycurl', 'certifi'],
         'aiohttp': ['aiohttp', 'aioftp'],
     },