Add caching to urlutils.check_url

pull/2/head
Thomas Sileo 2018-06-22 23:46:38 +02:00
rodzic ebcfc6e0a5
commit 714461d1d0
2 zmienionych plików z 11 dodań i 2 usunięć

Wyświetl plik

@ -15,11 +15,10 @@ from .backend import Backend
from .collection import parse_collection from .collection import parse_collection
from .errors import BadActivityError from .errors import BadActivityError
from .errors import Error from .errors import Error
from .errors import RemoteActivityGoneError
from .errors import NotFromOutboxError from .errors import NotFromOutboxError
from .errors import RemoteActivityGoneError
from .errors import UnexpectedActivityTypeError from .errors import UnexpectedActivityTypeError
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
UninitializedBackendError = Error("a backend must be initialized") UninitializedBackendError = Error("a backend must be initialized")

Wyświetl plik

@ -2,6 +2,7 @@ import ipaddress
import logging import logging
import os import os
import socket import socket
from typing import Dict
from urllib.parse import urlparse from urllib.parse import urlparse
from . import strtobool from . import strtobool
@ -10,6 +11,9 @@ from .errors import Error
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
_CACHE: Dict[str, bool] = {}
class InvalidURLError(Error): class InvalidURLError(Error):
pass pass
@ -27,6 +31,9 @@ def is_url_valid(url: str) -> bool:
if parsed.hostname in ["localhost"]: if parsed.hostname in ["localhost"]:
return False return False
if _CACHE.get(parsed.hostname, False):
return True
try: try:
ip_address = ipaddress.ip_address(parsed.hostname) ip_address = ipaddress.ip_address(parsed.hostname)
except ValueError: except ValueError:
@ -35,14 +42,17 @@ def is_url_valid(url: str) -> bool:
logger.debug(f"dns lookup: {parsed.hostname} -> {ip_address}") logger.debug(f"dns lookup: {parsed.hostname} -> {ip_address}")
except socket.gaierror: except socket.gaierror:
logger.exception(f"failed to lookup url {url}") logger.exception(f"failed to lookup url {url}")
_CACHE[parsed.hostname] = False
return False return False
logger.debug(f"{ip_address}") logger.debug(f"{ip_address}")
if ipaddress.ip_address(ip_address).is_private: if ipaddress.ip_address(ip_address).is_private:
logger.info(f"rejecting private URL {url}") logger.info(f"rejecting private URL {url}")
_CACHE[parsed.hostname] = False
return False return False
_CACHE[parsed.hostname] = True
return True return True