X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=Robots%2Fbkmk_rurllib_py3.py;h=268dad43cbb3444b910c8428d436603282503b49;hb=fbb34ad74643bbc69d141e26e105bcef3cdbc62c;hp=796a6fca3425bfb8d91d035968d02be246605bb3;hpb=5e3685956769a46ded587d33d5cb69ca4d0bbe7a;p=bookmarks_db.git diff --git a/Robots/bkmk_rurllib_py3.py b/Robots/bkmk_rurllib_py3.py index 796a6fc..268dad4 100644 --- a/Robots/bkmk_rurllib_py3.py +++ b/Robots/bkmk_rurllib_py3.py @@ -5,17 +5,25 @@ This file is a part of Bookmarks database and Internet robot. """ __author__ = "Oleg Broytman " -__copyright__ = "Copyright (C) 2000-2023 PhiloSoft Design" +__copyright__ = "Copyright (C) 2000-2024 PhiloSoft Design" __license__ = "GNU GPL" __all__ = ['robot_urllib_py3'] +import http.client +import socket import sys +import urllib import urllib.request from Robots.bkmk_robot_base import robot_base, get_error +# Fake to import 'add_headers' +urllib.URLopener = urllib.request.URLopener +urllib.ftpwrapper = urllib.request.ftpwrapper +from Robots.bkmk_rurllib import add_headers # noqa: E402 import not at top + class RedirectException(Exception): def __init__(self, errcode, newurl): @@ -41,6 +49,8 @@ class MyURLopener(urllib.request.URLopener): http_error_303 = http_error_301 # Error 307 -- relocated (temporarily) http_error_307 = http_error_301 + # Error 308 -- relocated (permanently) + http_error_308 = http_error_301 # Error 401 -- authentication required def http_error_401(self, url, fp, errcode, errmsg, headers, data=None): @@ -53,25 +63,12 @@ class MyURLopener(urllib.request.URLopener): fp.close() raise IOError(('http error', errcode, errmsg, headers)) + def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): + return urllib.request.URLopener.open(self, fullurl, data) -urllib.request._opener = opener = MyURLopener() - -# Fake headers to pretend this is a real browser -_user_agent = "Mozilla/5.0 (X11; U; Linux 2.6 i686; en)" -" Gecko/20001221 Firefox/2.0.0" -opener.addheaders[0] = ('User-Agent', _user_agent) -_x_user_agent = "bookmarks_db (Python %d.%d.%d; urllib/%s)" % ( - sys.version_info[0], sys.version_info[1], - sys.version_info[2], urllib.request.__version__ -) -opener.addheader('X-User-Agent', _x_user_agent) -opener.addheader('Referer', '') - -opener.addheader('Accept', '*/*') -opener.addheader('Accept-Language', 'ru,en') -opener.addheader('Cache-Control', 'max-age=300') -opener.addheader('Connection', 'close') +urllib.request._opener = opener = MyURLopener() +add_headers(opener) urllib_ftpwrapper = urllib.request.ftpwrapper ftpcache_key = None @@ -102,15 +99,39 @@ class robot_urllib_py3(robot_base): # Remove Accept-Charset del opener.addheaders[-1] - infile = open(fname, 'rt') - content = infile.read() - infile.close() - + possible_encodings = [] + for encoding in ( + bookmark.charset, + sys.getfilesystemencoding(), + 'utf-8', + ): + if encoding and encoding not in possible_encodings: + possible_encodings.append(encoding) + content = e = None + infile = open(fname, 'rb') + try: + content = infile.read() + except Exception: + content = None + finally: + infile.close() + + if content is None: + e = str(e) + return ( + 'ERROR: ' + e, + None, None, None, None + ) return None, None, None, headers, content except RedirectException as e: return None, e.errcode, e.newurl, None, None + except (OSError, http.client.IncompleteRead) as e: + error = str(e) + self.log(' Error: %s' % error) + return error, None, None, None, None + except IOError as e: if (e[0] == "http error") and (e[1] == -1): error = None